Тема: Программное создание размерных стилей

Я полагаю, что администрация переименует эту тему, ну ладно, не страшно.
Есть небольшая проблема: надо сделать размерный стиль, и внутри него дополнительные определения для размерных стилей на угловые размеры, радиусы и т.п. Через (tblobjname) получены списки настроек, имена, но сделать повторно через (entmake) не получается - возвращается nil.
Я понимаю, что есть некоторые значения dxf-кодов, которые являются обязательными. Какие обязательные, какие нет, мне вычислить не удалось. Поэтому собственно вопрос(ы) - даю несколько, чтобы и мне было понятно, и сразу на ошибки указали:
1. Для задания кодов 5, 6 и 7 (соответствуют dimblk, dimblk1, dimblk2) требуется имя блока - как его получать / задавать? через tblobjname или assoc? Или проще сделать через (setvar)?
2. Для кодов 340, 341 (соответственно dimtxtsty, dimldrblk, dimlwd) требуются уже хэндлы блоков - а к ним как обращаться?
3. Для кодов 371, 372 (соответственно dimlwd, dimlwe) требуются lineweight enum value - а это что за чудо? Для значения "ByLayer" чего надо назначать? А для "ByBlock", 0.25 etc?
---
P.S. Я искренне надеюсь, что здесь не будет применено правило "1 вопрос - одна тема". Получится 3 несвязанных между собою темы - имхо неудобно.

Re: Программное создание размерных стилей

> kpblc
...
3. Help2004 ->
-3 BYLAYER
-2 BYBLOCK
integer representing 100th of mm  (целое представляет сотую чать миллиметра...)
...

Re: Программное создание размерных стилей

> kpblc
...
1. ... требуется имя блока - как его получать...?
В смысле?

Re: Программное создание размерных стилей

> kpblc
...
2. Для кодов 340... :
(tblobjname "style" "standard")
...
Для кодов ..., 341, -  ... 344
(tblobjname "block" "ESC-01")

Re: Программное создание размерных стилей

> Jura
Меня-то смутило слово "enum" тра-ля-ля. Честно говоря, полагал, что имеется в виду номер  Я попробовал использовать и 25, и 0.25 - эффект все равно 0.

> Jura
Имеется в виду: когда я создаю список типа

       (list
         '(0 . "DIMSTYLE") '(2 . "kpblc_style")  '(70 . 0)      '(3 . "")   '(4 . "")      '(5 . "_ArchTick"))

(дальше уже просто не показываю) - вот здесь в (5 . "ArchTick") мне что надо использовать?
- (tblobjname "BLOCK" "_archtick") - тогда вроде как имя entity получаем?
- (assoс -1 (entget (tblobjname "block" "_archtick"))) - тоже вроде как имя, уже блока.
Так чего тут надо использовать, чтобы список построить?
Если надо полную картину, чего надо сделать, прошу в почту - пришлю файлик с настроенными (вручную) стилями.
Вариант вставки блоком не катит - _-purge через раз мои юзеры делают, так что настройки надо постоянно восстанавливать.

Re: Программное создание размерных стилей

> kpblc
DXF 5,6,7 и 342, 343, 344 есть предчуствие граблей... А2004 help -> DXF 5-7 вышли из употребления. beee ??? При этом в базе данных чертежа А2004 используются именно текстовые имена в 5-7 группах, в 342-344 голяк, отсюда вывод -> надо тестировать на конкретной платформе...
Возможно, эти группы, по разному ведут себя в базе данных и DXF-файле...
"...полагал, что имеется в виду номер ..." не понял... У Bylayer и Byblock нет значения... Integer выставляется для явного указания "толщины" размера, если не используются Bylayer или Byblock... Наверно каждый о своем...

Re: Программное создание размерных стилей

> Jura
Планируется на 2005, без вариантов на более ранних.
Про номер - в хелпе сказано насчет "enum weight" - я подумал, что мало ли, ByLayer имеет номер 1, ByBlock - 2, 0 мм - 3, и т.д. по таблице толщин. Квалификации не хватает катастрофически.
И вот еще - интересно было бы узнать, какие группы являются обязательными, а какие - нет. Ведь у того же Полещука насчет работы с таблицами напрямую ничего не сказано (в справке, кстати, тоже) - только графические примитивы, хотя и сказано, что через entmake / entmakex позволительно создавать неграфические. Вот бы и с этим еще понять...

Re: Программное создание размерных стилей

> kpblc
"... какие группы являются обязательными, а какие - нет..." Где? В AutoCAD, в Table "Dimstyle", в секции Tables?

Re: Программное создание размерных стилей

Ну я про то, что при создании графических примитивов, например, хрестоматийной LINE, достаточно сделать нечто вида:

(defun test-line( / ent_list)
  (setq ent_list (list
           '(0 . "LINE")
           '(10 0.0 0.0 0.0)
           '(11 100.0 0.0 0.0)
           )
    )
  (entmake ent_list)        
  )

И будет сделана линия на текущем слое, текущим типом линии и т.п., т.е не требуется задавать группы 8, 67, 210, 410 - все возьмется текущим. А для "DIMSTYLE" какие можно пропустить группы при назначении?

Re: Программное создание размерных стилей

В принципе через объектную модель создать новый стиль совсем не сложно. Необходимо установить размерные системные переменные в требуемое положение и запутить подобную фукнцию

(defun make-DimStyle (NewName)
    (if (/= (getvar "DimStyle") NewName)
        (vla-CopyFrom
            (vla-add (vla-get-DimStyles
                         (vla-get-activedocument
                             (vlax-get-acad-object)
                         )
                     )
                     NewName
            )
            (vlax-ename->vla-object
                (tblobjname "style" (getvar "DimStyle"))
            )
        )
        t
    )
)

Все недостоющее будет взято из текущего стиля.
При совпадении имени текущего и вновь создоваемого стилей (tblobjname ...)возвращает nil, что никуда не годится. Т.к. искать выход лень обошел это ограничение "IF"-ом. В итоге если все ок возвращает nil если имена совпадаеют то T. Вобщем разбирайся сам :)))

Re: Программное создание размерных стилей

> kpblc
+> AY (2005-09-12 13:20:22)
насчет консерватории...
смутно, как то : entmake не действует в section tables... это как то влияет на продолжение обсуждения?
Были обсуждения удаления "слоев" из этой секции, кажись разошлись на : либо command либо через VLA-расширения...

Re: Программное создание размерных стилей

> AY
Делал я так, до тех пор, пока не столкнулся с тем, что надо было делать отдельный стиль на угловые размеры, отдельно - на диаметры и т.п. (вручную работы на 2 минуты, а вот программно фигушки).

> Jura
Вот-вот, было подозрение, что ни entmake, ни entmakex не срабатывает почему-то напрямую в таблицы. А про какие vla-расширения тогда был разговор? Или ссылочку можно - хоть где это было (горю, решать надо сейчас, а знаний на нуле).

Re: Программное создание размерных стилей

> kpblc
то что предложил > AY (2005-09-12 13:20:22)...

Re: Программное создание размерных стилей

Чтобы было проще понимать, в чем проблема - см. www.webfile.ru/514212 в течение 7 дней до 12.09.2005 14:45.
Там все для примера, но принцип, я думаю, понятен. Мне надо именно такое сделать.

Re: Программное создание размерных стилей

> kpblc
Твоя правда, не выходит и у меня объектно создать стиль с разделением на подвиды. Думал, может если в (vla-CopyFrom ...) вторым аргументом передавать не стиль, а, например угловой размер, то будет толк, однако не получилось.
PS если кто захочет воспользоваться мною приведенным выше кодом учтите там ошибка в вызове (tblobjname...) правильно так:

(tblobjname [b]"dimstyle"[/b] (getvar "DimStyle"))

Re: Программное создание размерных стилей

Я к тому, что "недостающее" не получается, добавить имя в таблицу у меня получалось и через последовательность
(setvar ...)
(vl-cmdf "_.dimstyle" "_save" ...)
Медленно, конечно, но работало. А вот теперь надо на основании одного стиля создать несколько - для углов, радиусов и т.п.

Re: Программное создание размерных стилей

В help 2004 ни для entmod ни для entmake не указано запрещений для работы с секцией tables, только для entmake, упомянуты запрещения на создание viewport... И оговаривается начиная ACAD13 обязательное присутствие в списке 100 группы, для entmake...
IMHO entmkex сюда не пристегивается...
IMHO через VLA проще менять отдельные значения существующего объекта...

> AY

> kpblc
Не догоняю Ваше обсуждение... Размерные стили не делятся на улговые, радиусные, подвиды и т.п. ... Что обсуждаем? Размерные стили или Размерные примитивы?...

Re: Программное создание размерных стилей

> Jura
Посмотри на файлик (ссылка в > kpblc (2005-09-12 14:45:56)) - там понятно будет.
Разговор именно про угловые размерные стили, не знаю я, как по-другому это назвать.
Про entmake и entmakex: я тоже достаточно сильно удивлен, что им не получается сделать размерный стиль. Вообще никакой.
Может быть, проблема у меня в списке, собственно вопрос: что в списке не так, если (entmake) позволяет сделать новую запись в таблицу "DIMSTYLE"?
Что самое интересное: только что попробовал:

(setq aa (list '(0 . "LAYER") '(2 . "test") '(70 . 0) '(62 . 10) '(6 . "Continuous") '(370 . 25)))
(entmake aa)

Результат - nil. Опять что-то не нравится...
см. > kpblc (2005-09-12 10:28:05)

Re: Программное создание размерных стилей

Так, последняя строка чего-то перескочила. см > kpblc... - это должно идти после слова "DIMSTYLE"

Re: Программное создание размерных стилей

> Jura
Для отдельного стиля можно создавать подстили специально для отдельных видов размерных примитивов (или мы это как-то не корректно называем?). Об этом промежду прочим и идет речь...
Что касается (entmake ...) - она работает. Вот пример дублирования текущего стиля с новым именем

(setq a (entget (tblobjname "dimstyle" (getvar "DimStyle")))
      b "New-1"
      a (VL-REMOVE-IF
            '(lambda (x)
                 (or
                     (= (car x) -1)
                     (= (car x) 179)
                     (= (car x) 279)
                 )
             )
            a
        )
)
(entmake (subst (cons 2 b) (assoc 2 a) a))

Здесь наблюдается интерестный эффект. Если текущий стиль с которого делается дубль содержит подстили, то они у него пропадают, а у дубля появляются! Так, что все возможно, надо копать. Вероятно эти подстили существуют как отдельные стили (их так вероятно и надо созвавать), а в головном стиле на них только ссылки.

Re: Программное создание размерных стилей

Ну да, у них, помимо всего прочего, имена заканчиваются на <Имя_основного_стиля>$<номер>. Имена бог с ними, их можно и через (tblobjname) вычислить. У меня не получается именно создание стиля "с нуля", вот в чем проблема.

Re: Программное создание размерных стилей

> kpblc
Ваш тест должен звучать так:

((0 . "LAYER") (100 . "AcDbSymbolTableRecord") (100 .
"AcDbLayerTableRecord") (2 . "test") (70 . 0) (62 . 10) (6 . "Continuous") (370
. 25))

Я не зря писал про 100-тую группу...
Енто, про Ваш пример с созданием Слоя...

Re: Программное создание размерных стилей

Шо такое горе от ума? smile
это я на счет "подстилей"...
в результате вылез очень мягкий указатель... (330 группа)
[рекомендую инструмент: (entget (tblobjname "dimstyle" "kpblc"))]
to be continued...

Re: Программное создание размерных стилей

> AY
ну да, если подстили ссылаются на основной стиль, то они могут ссылаться только на один стиль. Поэтому, с Вашей точкой зрения Вы дублируете существующий, а возможно, с точки зрения программы происходит наоборот... И подстили вешаются на клон... IMHO

Re: Программное создание размерных стилей

Горе от ума - это я. За инфу спасибо, дома попробую. Я так просто не отстану ;)
P.S. А можно ко мне на "ты", а? А то я теряюсь, когда меня много, за всеми не уследишь опять-таки, как отчубучу чего-нить, самому потом стыдно...