Главная » Delphi, OLE, САПР » Простой линейный размер – КОМПАС в DELPHI

0

Несмотря на кажущуюся простоту задачи простановки простого линейного размера при ее решении задействуется несколько различных интерфейсов описывающих различные параметры проставляемого размера. Их мы и рассмотрим.

Строка (ksChar255)

Интерфейс ksChar255 предназначен для описания простой строки длиной до 255 символов. Получить данный интерфейс можно с помощью метода GetParamStruct интерфейса KompasObject. Для этого в качестве единственного параметра данному методу нужно передать константу ko_Char255.

У данного интерфейса всего одно свойство: str. Данное свойство содержит саму строку, описываемую этим интерфейсом.

Метод тоже всего один: Init(). Он очищает свойство str данного интерфейса.

Думаю с интерфейсом ksChar255 все понятно: он до неприличия прост и проблем возникнут с ним не должно.

Динамический массив (ksDynamicArray)

Интерфейс ksDynamicArray предназначен для описания динамических массивов. Вообще говоря, элементами данного массива могут выступать различные интерфейсы. Но в контексте задачи простановки линейного размера нас будет интересовать динамический массив интерфейсов ksChar255, то есть строк.

Получить этот интерфейс можно с помощью метода GetDynamicArray интерфейса KompasObject. В качестве единственного параметра данный метод принимает тип создаваемого массива. Типы массивов обсуждаются чуть ниже.

В начале рассмотрим методы интерфейса ksDynamicArray.

ksAddArrayItem добавить новый элемент в массив. Вот прототип этого метода:

ksAddArrayItem(

index: Integer;        //индекс элемента перед которым нужно

//вставить новый элемент const item: IDispatch  //вставляемый интерфейс

): Integer;

Если параметр index равен -1 (минус единице), то новый интерфейс вставляется в конец массива.

В случае удачного завершения данный метод возвращает единицу.

ksClearArray не имеет параметров. Очищает массив. В случае успеха возвращает единицу.

ksDeleteArray не имеет параметров. Удаляет массив. В случае удачного

завершения возвращает единицу.

ksExcludeArrayItem(long   index)   исключает   из   массива   элемент   с индексом index. В случае успеха возвращает единицу.

ksGetArrayCount() – возвращает количество элементов в массиве.

ksGetArrayItem позволяет получить выбранный элемент массива. Он имеет следующий прототип:

ksGetArrayItem(

index: Integer;        //Индекс элемента массива

const item: IDispatch  //Интерфейс элемента

): Integer

Параметр item определяет интерфейс, в который будут помещены данные выбранного элемента массива. В случае успеха данный метод возвращает единицу.

ksGetArrayType()   –   возвращает   тип   массива.   В   таблице   ниже представлены некоторые типы динамических массивов:

Символьное обозначение типа массива

Числовое обозначен ие типа массива

Интерфейс – элемент массива

Краткое описание интерфейса – элемента массива

CHAR_STR_ARR

1

ksChar255

Строка

длиной      255 символов

POINT_ARR

2

ksMathPointParam

Параметры

математическ ой точки

CURVE_PATTERN_ARR

21

ksCurvePattern

Параметры

участка штриховой кривой

TEXT_LINE_ARR

3

ksTextLineParam

Параметры

строки текста

TEXT_ITEM_ARR

4

ksTextItemParam

Параметры

компоненты строки текста

1 Как такое может быть, что у разных типов массивов одинаковое числовое обозначение типа, я не знаю. Но в документации КОМПАС указано именно так


ATTR_COLUMN_ARR

5

ksColumnInfoParam

Параметры

столбца табличного атрибута

USER_ARR

6

_

пользовательс

кие данные

POLYLINE_ARR

7

POINT_ARR

Массив

массивов

RECT_ARR

8

ksRectParam

Параметры

прямоугольни ка                 по

диагональным

точкам

LIBRARY_STYLE_ARR

9

ksLibraryStyleParam

Параметры

стиля             в

библиотеке стилей

VARIABLE_ARR

10

ksVariable

Внешняя

параметричес кая переменная модели

CURVE_PATTERN_ARR

_EX

11

ksCurvePatternEx

Параметры участка

«расширенной

»    штриховой кривой

LIBRARY_ATTR_TYPE

_ARR

12

ksLibraryAttrTypePar am

Параметры

типа атрибута в библиотеке типов

NURBS_POINT_ARR

13

ksNurbsPointParam

Параметры

точки   кривой NURBS

DOUBLE_ARR

14

ksDoubleValue

Переменная

типа double

CONSTRAINT_ARR

15

ksConstraintParam

Параметричес

кие   связи    и ограничения

CORNER_ARR

16

ksCornerParam

Параметры

скругленных (или усеченных) углов         для


прямоугольни

ка                   и

правильного многоугольни ка

DOC_SPCOBJ_ARR

17

ksDocAttachedSpcPar am

Параметры

документа, подключенног о   к   объекту спецификации

SPCSUBSECTION_ARR

18

ksSpcSubSectionPara m

Параметры

подраздела спецификации

SPCTUNINGSEC_ARR

19

ksSpcTuningSectionP aram

Параметры

настройки раздела спецификации

SPCSTYLECOLUMN_A RR

20

ksSpcStyleColumnPar am

Параметры

стиля колонки спецификации

SPCSTYLESEC_ARR

21

ksSpcStyleSectionPar am

Параметры

стиля  раздела спецификации

QUALITYITEM_ARR

22

ksQualityItemParam

Параметры

интервала квалитета

LTVARIANT_ARR

23

ksLtVariant

Интерфейс

для   хранения значений различных типов      (char,

double, float, int, long, short, string,    uChar,

uInt)

TOLERANCEBRANCH_ ARR

24

ksToleranceBranch

Параметры

«опоры» допуска формы

HATCHLINE_ARR

25

ksHatchLineParam

Параметры

линии штриховки

TREENODEPARAM_AR

R

26

ksTreeNodeParam

Параметры

узла      дерева


библиотеки

документов, библиотеки атрибутов

ksSetArrayItem позволяет изменить значение элемента массива. Вот прототип этого метода:

ksSetArrayItem(

index: Integer;      //Индекс изменяемого элемента массива const item: IDispatch //устанавливаемое значение

): Integer

В случае успеха данная функция возвращает значение единица. Обращаю ваше внимание на то, что нумерация элементов массива начинается с нуля.

Все. Больше методов у него нет. Идем дальше.

Параметры размерной надписи (ksDimTextParam)

Интерфейс ksDimTextParam позволяет задать параметры размерной надписи. Рассмотрим свойства этого интерфейса.

bitFlag - набор флагов, определяющий «состав» размерной надписи, то есть перечень тех элементов из которых состоит размерная надпись. В таблице ниже представлены эти флаги вместе с их описаниями и числовыми значениями (в шестнадцатеричной системе счисления).

Символьное обозначение флага

Числовое значение1 флага

Описание

_AUTONOMINAL

1

Автоматическое определение размера и простановка его в размерной надписи

_RECTTEXT

2

Надпись выводится в рамке

_PREFIX

4

Есть     текст      перед      самим

числовым                      размером (номиналом)

_NOMINALOFF

8

Сам     размер     (номинал)     не

выводится

_TOLERANCE

10

В   состав   размерной   надписи

входит квалитет

_DEVIATION

20

В   состав   размерной   надписи

1 В шестнадцатеричной системе счисления


входят отклонения

_UNIT

40

В   состав   размерной   надписи

входит единица измерения

_SUFFIX

80

В   состав   размерной   надписи

водит     текст    после     самого размера (номинала)

_DEVIATION_INFORM

100

Согласно              документации

КОМПАС данный флаг говорит о том, что мы вручную указываем отклонения без учета устанавливаемого квалитета. Однако добиться правильной работы этого флага мне так и не удалось

_UNDER_LINE

200

Размерная надпись выводится с

подчеркиванием

_BRACKETS

400

Размерная надпись выводится в

круглых скобках

_SQUARE_BRACKETS

800

Используется только совместно

с флагом _BRACKETS. Говорит о том, что размерная надпись выводится в квадратных скобках

Теперь несколько замечаний по поводу работы с этими флагами:

1)                                               При      установке      флагов      _RECTTEXT,       _UNDER_LINE,

_BRACKETS и _SQUARE_BRACKETS обведенным в рамку (подчеркнутым, окаймленным скобками) оказывается не вся размерная надпись, а только ее часть, состоящая из самого размера, квалитета и отклонений. На остальные составляющие размерной надписи эти флаги никак не влияют.

2)                                               Флаг _DEVIATION_INFORM никак не влияет на отображение размерной надписи. Честно говоря, я так и не понял: зачем он нужен на самом деле или не понял как его правильно использовать.

3)                                               Если  флаг  _TOLERANCE  не  установлен,  но  установлен  флаг

_DEVIATION, то система ведет себя так: квалитет не выводит, строку1 с нижним отклонением выводит на месте единицы измерения, а строку с верхним отклонением игнорирует.

4)                                               Если установлены оба флага _TOLERANCE и _DEVIATION, то система сама определяет отклонения на основе размера и квалитета. Если квалитет задан неправильно, то система не будет выводить ни квалитет, ни отклонения.

5)                                               Одновременное   использование   флагов   _AUTONOMINAL   и

_NOMINALOFF        равносильно        использованию        одного        флага

1 О том где и как задаются строки с элементами размерной надписи мы поговорим ниже

_AUTONOMINAL,  то  есть  в  этом  случае  флаг  _NOMINALOFF  просто игнорируется.

6)                                               Если не установлен ни один флаг,  то есть поле bitFlag равно нулю,  то  выводится  только  сам  размер  (номинал).  Все  остальные  части

размерной надписи не выводятся.

Sign – определяет тип условного значка перед размером. Ниже представлены значения этого поля для разных условных значков:

0 – нет никакого значка; 1 – диаметр;

2                                  – квадрат;

3                                  – радиус;

StringFlag – определяет тип динамического массива, в котором должны храниться строки с элементами размерной надписи. Если это поле принимает значение true, то массив должен иметь тип TEXT_LINE_ARR (см. предыдущий раздел), если же это поле равно false, то массив должен иметь тип CHAR_STR_ARR. Единственная разница между этими массивами в том, какой интерфейс является элементом массива. Подробности смотри в предыдущем разделе.

Style задает системный стиль текста. В таблице ниже представлены все системные тили текстов из документации КОМПАС

Номер стиля текста

Описание

0

Стиль по умолчанию

1

Обычный текст

2

Текст для технических требований

3

Текст размерной надписи

4

Текст в обозначении шероховатости

5

Текст на позиционной линии-выноске

6

Текст над/под полкой линии-выноски

7

Текст на ответвлении линии-выноски

8

Текст в обозначении допуска формы

9

Текст для заголовка таблицы

10

Текст для ячейки таблицы

11

Текст для линии разреза

12

Текст для стрелки направления взгляда

13

Текст в обозначении неуказанной шероховатости

14

Текст в обозначении изменения

На    этом    свойства    интерфейса    ksDimTextParam   заканчиваются. Переходим к его методам.

GetBitFlagValue  –  позволяет проверить установлен  отдельно  взятый флаг в свойстве bitFlag или нет. Данный метод имеет прототип:

GetBitFlagValue(

bitFlag: Integer ;проверяемый флаг

): WordBool

Единственный параметр данного метода представляет собой проверяемый флаг из таблицы доступных флагов для поля bitFlag данного интерфейса. Если этот флаг установлен данный метод возвращает значение true, в противном случае он возвращает значение false.

GetTextArr() – возвращает интерфейс динамического массива ksDynamicArray, в котором хранятся строки с элементами выводимой размерной надписи.  Количество строк  в этом  массиве  зависит от набора

флагов в свойстве bitFlag, но их порядок всегда постоянен: текст перед размером, сам размер, квалитет, верхнее отклонение, нижнее отклонение, единица измерения, текст после размера, дополнительные строки.

Что такое дополнительные строки? Это строки, которые выводятся системой под размером. На рисунке ниже  представлено несколько таких строк, выводимых системой КОМПАС:

Интерфейс представления строк в массиве определяется свойством StringFlag интерфейса ksDimTextParam.

Init – служит для обнуления интерфейса ksDimTextParam, то есть сброса всех его свойств в значение по умолчанию. Единственным параметром для данного метода является новое значение свойства StringFlag. В случае успешного завершения данный метод возвращает значение true.

SetBitFlagValue – служит для изменения состояния флагов в свойстве bitFlag. Вот прототип этого метода:

SetBitFlagValue(

val: Integer;  //Флаг, состояние которого мы меняем state: WordBool //Новое состояние этого флага

): WordBool

Параметр state описывает, что нужно сделать с этим флагом: true – установить; false – сбросить. В случае спеха данный метод возвращает значение true.

Вообще говоря, вы сами вольны выбирать, каким из двух методов менять значение свойства bitFlag: либо путем прямого обращения к этому свойству, либо с помощью данного метода.

SetTextArr – служит для изменения динамического массива строк, в

котором хранятся строки с элементами размерной надписи (см. выше). Единственный параметр данного метода это интерфейс нового массива строк ksDynamicArray. В случае удачного изменения массива строк данный метод возвращает значение true.

На этом описание интерфейса ksDimTextParam заканчивается. Переходим к следующему интерфейсу, связанному с простановкой линейных размеров.

Параметры отрисовки размера (ksDimDrawingParam)

Интерфейс ksDimDrawingParam позволяет  описать  параметры отрисовки размера, то есть то, как отрисовывать размер, как он должен выглядеть. Рассмотрим свойства этого интерфейса.

ang – задает угол наклона «ножки» выносной полки.

lenght1 – длина «ножки» выносной полки.

pl1 – определяет нужно ли отрисовывать выносную линию. Если то свойство установлено в значение True, то выносная линия не отрисовывается, в противном случае (если значение данного свойства установлено в false) выносная линия не отрисовывается.

pl2 – аналогично свойству pl1, но для второй выносной линии.

pt1 – задает тип стрелки у первой выносной линии. Возможные значения данного свойства и их интерпретация представлены в таблице ниже:

Числовое значение

Описание

Результат использования2

0

Стрелки нет

1          Да, правильнее было бы назвать это свойство length («длина» в переводе с  английского), но данное свойство называется именно так. Это не опечатка с моей стороны. Поэтому будьте внимательны

2          Для больше наглядности данное значение свойства pt1 применено к обоим точкам пересечения с выносными линиями


1

Стрелка внутри

2

Стрелка снаружи

3

Засечка

4

Точка

pt2 – аналогично свойству pt1, но для стрелки у второй выносной линии.

shelfDir – направление выносной полки. В таблице ниже представлены все допустимые значения этого свойства вместе с результатами его использования.

Числовое значение

Описание

Результат использования

-1

Полка влево


0

Полки нет. Значения свойств ang и lenght игнорируются

1

Полка вправо

2

Полка вверх

3

Полка вниз

textBase – задает характер размещения размерной надписи. В таблице ниже перечислены возможные значения данного свойства.

Числовое значение

Описание

0

Размерная надпись выравнивается по центру размерной

линии

1

Размерная    надпись  размещается  на  фиксированном

расстоянии от первой точки

2

Размерная  надпись  размещается  на  фиксированном

расстоянии от второй точки

3

«Общая размерная линия»

Что значит «Общая размерная линия»? Скорее всего, здесь имеется в виду размещение большого числа идущих вряд размеров располагаемых на

одной размерной линии. Но может я и ошибаюсь. Как бы то ни было, размер при использовании этого значения свойства принимает вид как на рисунке ниже:

И последнее свойство.

textPos – в том случае если свойство textBase принимает значение 0, 1 или 2, данное свойство (textPos) задает то самое фиксированное расстояние, на которое размерная надпись удаляется от одной из концевых точек размерной линии. В том случае, если textBase равен трем, данное свойство игнорируется.

Метод у данного интерфейса всего один1. Init(). Он не имеет входных

параметров и служит для сброса всех свойств данного интерфейса в значения по умолчанию. В случае успеха данный метод возвращает значение true.

Параметры привязки линейного размера (ksLDimSourceParam)

Интерфейс ksLDimSourceParam также служит для описания параметров отрисовки линейного размера. Рассмотрим его свойства.

basePoint – определяет от какой из двух концевых точек размерной линии следует откладывать вектор [dx;dy] (о нем чуть ниже).

dx  и  dy  -  задают  ориентацию  размерной  линии.  Конкретная  их интерпретация зависит от свойства ps этого же интерфейса.

ps  –  определяет  ориентацию  размерной  линии  и  то,  как  следует интерпретировать   параметры   dx   и   dy.   Возможные   значения   данного

параметра описаны в таблице ниже.

1 В примерах использования свойства textPos данного интерфейса упоминаются еще два метода: GetTextPos и SetTextPos, предназначенные для работы с данным свойством. Однако …. Барабанная дробь …. Та же самая документация КОМПАС их никак не описывает. В заголовочном файле ksTLB.pas они так же не упоминаются


Значение ps

Описание

Интерпретация dx

Интерпретация dy

0

Размерная линия располагается горизонтально

игнорируется

Расстояние    между

размерной линией и измеряемым отрезком

1

Размерная линия располагается вертикально

Расстояние     между

размерной линией и измеряемым отрезком

игнорируется

2

Размерная линия

располагается параллельно измеряемому отрезку

Задают вектор, в направлении которого строится размерная линия. При этом сама размерная линия остается параллельной измеряемому отрезку

3

Выносная линия располагается по вектору [dx; dy]

Вектор   [dx;   dy]   задает   ориентацию   и

размер одной из выносных линий. Вторая выносная линия располагается параллельно первой, но, может иметь несколько другой размер, из-за чего размерная линия располагается не параллельно измеряемому отрезку. Почему возникает такое различие в длине я так и не понял.

4

Параллельно измеряемому отрезку с выносными линиями по вектору [dx; dy]

Аналогично предыдущему, только в этот раз размерная линия гарантированно располагается параллельно измеряемому отрезку

x1 и yi – координаты первой точки измеряемого отрезка.

x2 и y2 – координаты второй точки измеряемого отрезка.

Метод у данного интерфейса всего один: Init(). Он не имеет входных параметров и служит для обнуления всех свойств данного интерфейса.

Параметры линейного размера (ksLDimParam)

Интерфейс ksLDimParam представляет собой объединение трех ранее рассмотренных интерфейсов: ksDimDrawingParam (определяет параметры отрисовки линейного размера), ksLDimSourceParam (определяет параметры привязки линейного размера) и ksDimTextParam (определяет параметры размерной надписи).

У интерфейса ksLDimParam нет свойств, поэтому переходим к рассмотрению его методов:

GetDPar() – возвращает интерфейс ksDimDrawingParam;

GetSPar() – возвращает интерфейс ksLDimSourceParam;

GetTPar() – возвращает интерфейс ksDimTextParam;

SetDPar(const val: IDispatch) – устанавливает новый интерфейс ksDimDrawingParam, передаваемый ему в качестве единственного параметра. В случае успешного изменения возвращает значение true.

SetSPar(const val: IDispatch) – устанавливает новый интерфейс ksLDimSourceParam, передаваемый ему в качестве единственного параметра. В случае успешного изменения возвращает значение true.

SetTPar(const val: IDispatch) – устанавливает новый интерфейс ksDimTextParam, передаваемый ему в качестве единственного параметра. В случае успешного изменения возвращает значение true.

Как видите ничего сложного. Получить интерфейс ksLDimParam можно с помощью метода GetParamStruct интерфейса KompasObject, для этого в качестве единственного параметра данного метода нужно передать

константу ko_LDimParam.

Построение линейного размера

После того как мы рассмотрели все интерфейсы, описывающие линейный размер пора ответить на главный вопрос всей этой главы: как построить линейный размер?

Для этого предназначен метод ksLinDimension интерфейса ksDocument2D. В качестве единственного  параметра он  принимает интерфейс ksLDimParam, обсуждавшийся в прошлом разделе данной главы.

В случае успеха данный метод возвращает числовой идентификатор построенного размера, а в случае ошибки – нуль.

Вот и все что можно сказать по данному методу. Думаю, пришло время перейти к практическому закреплению материала данной главы. Так как материал данной главы достаточно обширен и сложен, то примеров будет несколько, чтобы отразить различные аспекты построения линейного размера.


Пример 1. Простой горизонтальный размер

Ниже приводится ключевой фрагмент программы, в которой строится горизонтальный размер отрезка.

var

kompas: KompasObject; Document2D: ksDocument2D; Char255: ksChar255; DynamicArray: ksDynamicArray; LDimParam: ksLDimParam;

DimDrawingParam: ksDimDrawingParam; LDimSourceParam: ksLDimSourceParam; DimTextParam: ksDimTextParam;

………………………………

Begin

………………………………

//Отрезок, длину которого мы будем проставлять в размере

Document2D.ksLineSeg(100, 100, 130, 100, 1);

//Получаем интерфейс ksLDimParam

LDimParam:=ksLDimParam(kompas.GetParamStruct(ko_LDimParam));

//Получаем интерфейс ksDimDrawingParam

DimDrawingParam:=ksDimDrawingParam(LDimParam.GetDPar());

//Устанавливаем параметры отрисовки размера DimDrawingParam.ang:=0;    //Угол наклона ножки выносной полки DimDrawingParam.lenght:=0; //Длина ножки выносной полки DimDrawingParam.pl1:=false; //Отрисовывать первую выносную линию DimDrawingParam.pl2:=false; //Отрисовывать вторую выносную линию DimDrawingParam.pt1:=1;    //У первой выносной линии стрелка внутри DimDrawingParam.pt2:=1;    //У второй выносной линии стрелка внутри DimDrawingParam.shelfDir:=0;//Выносной полки нет DimDrawingParam.textBase:=0;//Текст размещается в центре DimDrawingParam.textPos:=0; //Автоматическое размещение текста

//Получаем интерфейс ksDimSourceParam

LDimSourceParam:=ksLDimSourceParam(LDimParam.GetSPar());

//Устанавливаем параметры привязки линейного размера

LDimSourceParam.basePoint:=1; //Рисуем от первой точки ко второй

//Вектор направления размерной надписи LDimSourceParam.dx:=0; LDimSourceParam.dy:=10;

LDimSourceParam.ps:=0; //Размерная линия размещена горизонтально

//Координаты первой точки измеряемого отрезка

LDimSourceParam.x1:=100; LDimSourceParam.y1:=100;

//Координаты второй точки измеряемого отрезка

LDimSourceParam.x2:=130; LDimSourceParam.y2:=100;

//Получаем интерфейс ksDimTextParam

DimTextParam:=ksDimTextParam(LDimParam.GetTPar);

//Устанавливаем параметры размерной надписи DimTextParam.bitFlag:=0; //Будем выводить только номинал DimTextParam.sign:=0; //Значка нет

DimTextParam.stringFlag:=false;

//получаем интерфейс KsChar255

Char255 := ksChar255(kompas.GetParamStruct(ko_Char255));

//Получаем интерфейс ksDynamicArray

DynamicArray := ksDynamicArray(DimTextParam.GetTextArr()); DynamicArray.ksClearArray();

//Строка с номиналом Char255.str:=’30′; DynamicArray.ksAddArrayItem(-1, Char255);

//Строим сам размер Document2D.ksLinDimension(LDimParam); kompas.Visible:=true;

end;

Как видите, ничего сверхсложного в этом нет. Результат работы этой программы представлен на рисунке ниже.

Источник: Норсеев Сергей, «РАЗРАБОТКА ПРИЛОЖЕНИЙ ПОД КОМПАС В DELPHI»

По теме:

  • Комментарии