Почему функция entmod не обновляет стиль размеров?
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Почему функция entmod не обновляет стиль размеров?

Почему функция entmod не обновляет стиль размеров?

Ответ
Поиск в этой теме
Непрочитано 21.12.2022, 08:40 #1
Почему функция entmod не обновляет стиль размеров?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,134

Функция предназначена для создания нового размерного стиля или для обновления параметров существующего стиля если такой стиль уже создан:
Код:
[Выделить все]
 
(defun MakeDimStyle (NDS MKLine MKMsh)
;Функция создает размерный стиль с заданными параметрами
;Если заданный стиль существует, то выполняется команда обновления стиля
;Сформируем код стиля
	(setq KodStyle (list
        (cons 0 "DIMSTYLE")
        (cons 100 "AcDbSymbolTableRecord")
        (cons 100 "AcDbDimStyleTableRecord")
        (cons 2 NDS)
        (cons 3 "")
        (cons 4 "")
        (cons 5 "Oblique")
        (cons 6 "Oblique")
        (cons 7 "Oblique")
        (cons 70 0)
        (cons 40 MKLine) ;dimscale
        (cons 41 1.25) ;dimasz величинамы стрелок размерных линий и линий выносок
        (cons 42 0.625) ;dimexo величина смещения выносных линий относительно исходных точек
        (cons 43 5.0) ;dimdli шаг базовых размеров
        (cons 44 0.9) ;dimexe величину, на которую выносная линия должна выступать за размерную линию
        (cons 45 0) ;dimrnd  округление размеров
        (cons 46 0.9) ;dimdle значение расстояния, на которое размерная линия выступает за выносную линию
        (cons 140 2.5) ;dimtxt   
        (cons 141 -2.5) ;dimcen  
        (cons 143 0.005) ;dimaltf
        (cons 144 MKMsh) ;dimlFAC
        (cons 145 0) ;dimtvp
        (cons 147 1.0) ;dimgap отступ текста от размерной линии
        (cons 72 0) ;dimlim
        (cons 73 0) ;dimtih  
        (cons 74 0) ;dimtoh  
        (cons 77 1) ;dimtad  
        (cons 78 8) ;dimzin  
        (cons 79 2) ;dimazin 
        (cons 170 0) ;dimalt
        (cons 172 1) ;dimtofl
        (cons 173 0) ;dimsah   
        (cons 174 0) ;dimtix
        (cons 175 1) ;dimsoxd
        (cons 176 0) ;dimclrd
        (cons 177 0) ;dimclre
        (cons 178 6) ;dimclrt цвет символов размеров
        (cons 179 1) ;dimadec число знаков после запятой в угловых размерах
        (cons 271 2) ;dimdec число знаков после запятой
        (cons 272 0) ;dimtdec
        (cons 275 1) ;dimaunit
        (cons 277 2) ;dimlunit
        (cons 278 44) ;dimdsep десятичная точка
        (cons 279 0) ;dimtmove
        (cons 280 0) ;dimjust
        (cons 281 0) ;dimsd1
        (cons 282 0) ;dimsd2
        (cons 283 0) ;dimtolj
        (cons 284 8) ;dimtzin
        (cons 288 0) ;dimupt
        (cons 340 (tblobjname "style" "Standard")) ;dimtxtsty
        (cons 371 -2) ;dimlwd
        (cons 372 -2) ;dimlwe
        (cons 342  (_lispru-get-or-create-dimblock "_Oblique"))
        (cons 343  (_lispru-get-or-create-dimblock "_Oblique"))
        (cons 344  (_lispru-get-or-create-dimblock "_Oblique"))))
;Получим список размерных стиляей
	(setq LstDimStyles (GetDimStyles))
 ;Проверим существование заданного стиля
	(if (vl-position NDS LstDimStyles) (progn
	    (setq acadObj (vlax-get-acad-object))
	    (setq doc (vla-get-ActiveDocument acadObj))
		(setq DimStyle (entget (vlax-vla-object->ename (vla-Item (vla-get-DimStyles doc) NDS))))
;Модифицируем существующий стиль
		(foreach item KodStyle
			(if (> (setq nLe (car item)) 5) (setq DimStyle (subst item (assoc nLE DimStyle) DimStyle))))
		(entmod DimStyle)
		(setq VlaObj (vlax-ename->vla-object DimStyle))
		(vla-update VlaObj))
;Создадим новый стиль
		(entmakex KodStyle))
)
Список DimStyle в итоге обновляется, получает новые значения масштабных коэффициентов (значения кодов 40 и 144). Но в итоге на чертеже размеры не меняются.
А метод (entmod DimStyle) возвращает nil
При попытке обновить стиль размеров через vla функции появляется ошибка:
неверный тип аргумента: lentityp ((-1 . <Имя объекта: 1390cba8e0>) (0 . "DIMSTYLE") (105 . "10FFCE") (102 . "{ACAD_REACTORS") (330 . <Имя объекта: 1390cba8f0>) (102 . "}") (330 . <Имя объекта: 13fb423ae0>) (100 . "AcDbDimStyleTableRecord") (100 . "AcDbDimStyleTableRecord") (2 . "М5_10_мм") (70 . 0) (40 . 10.0) (41 . 1.25) (42 . 0.625) (43 . 5.0) (44 . 0.9) (46 . 0.9) (73 . 0) (74 . 0) (77 . 1) (78 . 8) (79 . 2) (140 . 2.5) (141 . -2.5) (143 . 0.005) (144 . 0.5) (147 . 1.0) (172 . 1) (175 . 1) (178 . 6) (179 . 1) (271 . 2) (272 . 0) (275 . 1) (278 . 44) (283 . 0) (284 . 8) (340 . <Имя объекта: 13fb423a00>) (342 . <Имя объекта: 13fb423b30>) (343 . <Имя объекта: 13fb423b30>) (344 . <Имя объекта: 13fb423b30>))
Почему entget не работает и почему функция (vlax-ename->vla-object DimStyle) возвращает ошибку?

Последний раз редактировалось МишаИнженер, 21.12.2022 в 08:48.
Просмотров: 1640
 
Непрочитано 21.12.2022, 08:45
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Почему entget не работает и почему функция vla-update возвращает ошибку?
С чего ты взял что не работает? А vla-update генерирует ошибку потому, что ему нужен в качестве параметра другой тип аргумента. Ты вообще отладчиком пользуешься?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.12.2022, 08:51
#3
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ты вообще отладчиком пользуешься?
Конечно пользуюсь! Не могу добраться до выполнения функции (vla-update VlaObj). На предыдущей строке не конвертируется объект DimStyle (с обновленным списком) во Vla объект в строке (vlax-ename->vla-object DimStyle). Ну и далее выполнение останавливается.
Вроде понял почему: функции vlax-ename->vla-object надо задавать параметр в виде <Entity name: 7ef8bf68> а у меня список после функции (entget: DimStyle
Как можно превратить список DimStyle в объект типа <Entity name: 7ef8bf68>?

Последний раз редактировалось МишаИнженер, 21.12.2022 в 08:57.
МишаИнженер вне форума  
 
Непрочитано 21.12.2022, 09:06
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


Включаем голову... у тебя dimstyle - уже список. Который ты получил через entget. А entget'у ты подсовываешь что? Правильно, ename-указатель на размерный стиль. Который получен как? Правильно, преобразованием vlax-vla-object->ename. Дальше продолжать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.12.2022, 09:19
#5
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Который ты получил через entget
Да, список получен через entget, но потом этот список модифицирован. Теперь надо обновить базу данных чертежа, чтобы эти изменения отобразились в чертеже.
Обновляет базу данных функция vla-update, но она работает не со списком, а указателем на VLA-объект. А у меня сейчас есть только список (это как запись карандашом в блокноте). Этот список пока ничего не значит, пока он не внедрен в чертеж. Как мне внедрить этот список в чертеж?
Может быть надо обновлять список не устаревшей функцией subst, а какой-то новой функцией Vla? Есть такая функция Vla аналог subst?
Желающие проверить ошибку на практике скачайте прикрепленные файлы lsp и dcl (Кстати, почему файлы dcl на нелегальном пожении? Почему их нельзя отдельно прикреплять как файлы lsp?)
Вложения
Тип файла: zip StyleDraw.zip (34.0 Кб, 2 просмотров)

Последний раз редактировалось МишаИнженер, 21.12.2022 в 09:31.
МишаИнженер вне форума  
 
Непрочитано 21.12.2022, 10:04
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


М-да, придется продолжать...
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Который получен как? Правильно, преобразованием vlax-vla-object->ename.
Расшифровываю: кто-то мешает повторно получить указатель на размерный стиль (раз уж в переменную не захотел сохранять(? Хоть через хендл, хоть как у тебя сделано?

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Желающие проверить ошибку на практике
Это не ошибка языка, это - ошибка разработчика. Который вместо одного подсовывает другое.
Напоминает анекдот про суровых сибирских лесорубов и японскую пилораму...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.12.2022, 10:16
| 1 #7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Offtop:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ты вообще отладчиком пользуешься?
внешним отладчиком dwg.ru пользуется
Сергей812 вне форума  
 
Автор темы   Непрочитано 21.12.2022, 11:25
#8
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
раз уж в переменную не захотел сохранять(? Хоть через хендл, хоть как у тебя сделано?
Если я сохраню Handle на этот стиль и потом поменяю числа в списке этого стиля, как мне потом применить эти изменения к объекту?
Используя Handle я должен заменить список чертежа на отредактированный список. Какая функция это делает?
МишаИнженер вне форума  
 
Непрочитано 21.12.2022, 11:33
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


https://images.autodesk.com/adsk/fil...erence_enu.pdf > ENTITIES Section, Common Group Codes for Entities
Читай, изучай, смотри на значения своих переменных.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.12.2022, 12:30
#10
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ENTITIES Section, Common Group Codes for Entities
Допустим получу я с помощью функции assoc метку объекта, а потом с помощью функции entget можно получить сам объект?
МишаИнженер вне форума  
 
Непрочитано 21.12.2022, 12:49
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Допустим получу я с помощью функции assoc метку объекта, а потом с помощью функции entget можно получить сам объект?
entget : https://help.autodesk.com/view/OARX/...C-DDFE5BE3C42A
Читаем очень внимательно: Retrieves an object's (entity's) definition data.

Return Values
An association list containing the entity definition of ename. If you specify the optional applist argument, entget also returns the extended data associated with the specified applications. Objects in the list are assigned AutoCAD DXF™ group codes for each part of the entity data.

Note that the DXF group codes used by AutoLISP differ slightly from the group codes in a DXF file.
И где ты тут видишь упоминание о том, "из чего" получен результирующий список?

Если ты получил хендл объекта, то преобразовать это в объект (хрен с ним, использую твою терминологию) - вопрос трех секунд гугления (если в документацию и литературу принципиально не заглядывать).

Offtop: Подсказок уже мама не горюй, а все едино.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.12.2022, 07:30
#12
МишаИнженер


 
Регистрация: 14.12.2008
Сообщений: 1,134


Исправил модификацию существующего стиля размеров только на обновление масштабных коэффициентов с кодами 40 и 144
Код:
[Выделить все]
 
;Получим список размерных стиляей
	(setq LstDimStyles (GetDimStyles))
 ;Проверим существование заданного стиля
	(if (vl-position NDS LstDimStyles) (progn
	    (setq acadObj (vlax-get-acad-object))
	    (setq doc (vla-get-ActiveDocument acadObj))
		(setq DimStyle (entget (vlax-vla-object->ename (vla-Item (vla-get-DimStyles doc) NDS))))
;Модифицируем существующий стиль
		(setq DimStyle (subst (assoc 40 KodStyle) (assoc 40 DimStyle) DimStyle))
		(setq DimStyle (subst (assoc 144 KodStyle) (assoc 144 DimStyle) DimStyle))
;;;		(foreach item KodStyle
;;;			(if (> (setq nLe (car item)) 2) (setq DimStyle (subst item (assoc nLE DimStyle) DimStyle))))
		(entmod DimStyle)
;Удалим старое определение стиля в таблице стилей
	 	(setq LstDimStyles (GetDimStyles)))
;;;		(vla-update (vlax-ename->vla-object DimStyle))
;Создадим новый стиль
		(entmakex KodStyle))
Теперь старый стиль улетает в модификацию Override нового стиля с тем же названием
Естественно чертеж не изменяется при таком обновлении стиля размеров. Чертеж начинает меняться когда "неверная модификация Override" удаляется из списка стилей размеров. Получается для полноценного обновления стиля надо на ЛИСП удалить модификацию Override для этого стиля.
Как на ЛИСП удалить все Overrides стиля размеров?
МишаИнженер вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Почему функция entmod не обновляет стиль размеров?

Реклама i
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При повторном запуске кода, функция SSGET возвращает nil. Почему? vladimirr_b Программирование 3 25.11.2015 03:41
Почему не активна функция ветер/снег 2Д/3Д в нагрузках? ФАХВЕРК Robot 6 02.10.2015 10:06
Невидимые объекты в блоке или почему блок нереальных размеров zekatyumen Динамические блоки 4 26.06.2015 07:21
Почему, когда я ввожу текст после определенной буквы меняется стиль текста? ai_karamba AutoCAD 3 03.06.2014 08:44
Почему не работает нормально концептуальный стиль для 3Д модели Niko777 AutoCAD 4 29.11.2013 15:10