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

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

Как получить список размерных стилей из таблицы DIMSTYLE?

Ответ
Поиск в этой теме
Непрочитано 17.12.2022, 14:02 #1
Как получить список размерных стилей из таблицы DIMSTYLE?
МишаИнженер
 
Регистрация: 14.12.2008
Сообщений: 1,079

Для получения списка стилей мультилиний из словаря ACAD_MLINESTYLE используется код:
Код:
[Выделить все]
 (setq dict (dictsearch (namedobjdict) "ACAD_MLINESTYLE"))
А как выглядит код для получения списка размерных стилей из таблицы DIMSTYLE?
Просмотров: 1020
 
Непрочитано 17.12.2022, 14:19
#2
Кулик Алексей aka kpblc
Moderator

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


МишаИнженер, а поискать не пробовал? Почитать там, поковырять.

----- добавлено через ~2 мин. -----
https://www.google.com/search?q=autolisp+dimstyles для начала.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.12.2022, 16:27
#3
МишаИнженер


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


Нашел вот такую функцию:
Код:
[Выделить все]
 
(vl-load-com)
(defun c:DSC()
    (setq acadObj (vlax-get-acad-object))
    (setq doc (vla-get-ActiveDocument acadObj))
    (setq dimStyles (entget (vlax-vla-object->ename (vla-get-DimStyles doc))))
	(print dimStyles)
)
Функция vla-get-DimStyles должна выдавать список размерных стилей, но что-то списка не видно. Почему так получается?
Где в ответе список размерных стилей?
((-1 . <Имя объекта: 22bfea790a0>) (0 . "TABLE") (2 . "DIMSTYLE") (330 . <Имя объекта: 0>) (5 . "A") (100 . "AcDbSymbolTable") (70 . 7) (100 . "AcDbDimStyleTable") (71 . 4) (340 . <Имя объекта: 22bfea5f4b0>) (340 . <Имя объекта: 22b9baa9960>) (340 . <Имя объекта: 22b93d87230>) (340 . <Имя объекта: 22b93d691a0>)) ((-1 . <Имя объекта: 22bfea790a0>)

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

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


Потому что гладиолус. Ты по ссылке поиска проходил?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.12.2022, 16:42
#5
МишаИнженер


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


Там страницы о том как создать размерный стиль. Я поменял запрос поиска на "autolisp dimstyles collections" и там уже нашел этот пример
Вот ссылка где нашелся этот пример:
https://help.autodesk.com/view/OARX/...0-3B8040981FAA
МишаИнженер вне форума  
 
Непрочитано 17.12.2022, 16:45
#6
Кулик Алексей aka kpblc
Moderator

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


А дальше первой ссылки пройтись - не?
https://tstu.ru/book/elib3/mm/2018/B...ml/page40.html - для кого написано?

----- добавлено через ~3 мин. -----
Цитата:
Сообщение от МишаИнженер Посмотреть сообщение
Там страницы о том как создать размерный стиль. Я поменял запрос поиска на "autolisp dimstyles collections" и там уже нашел этот пример
Вот ссылка где нашелся этот пример:
https://help.autodesk.com/view/OARX/...0-3B8040981FAA
И по ответу ты получаешь что? Праальна, коллецию. Удивительно, правда? А что надо делать с коллекцией? Праальна, думать, читать и анализировать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.12.2022, 17:25
#7
МишаИнженер


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


Сделал функцию с использованием TBLNEXT
Код:
[Выделить все]
 
(defun c:DSCPr()
	(while (setq dimstyle (tblnext "dimstyle"))
	  (setq NameDS (cdr (assoc 2 dimstyle)))
	  (Setq SpDS (cons NameDS SpDS))
	)
	(setq SpDS (reverse SpDS))
)
Функция работает, но почему-то выдает не весь список размерных стилей.
Почему так получается и как это исправить?

----- добавлено через ~20 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А что надо делать с коллекцией?
А есть ссылка почитать интересное про эти коллекции?
МишаИнженер вне форума  
 
Непрочитано 17.12.2022, 18:00
#8
Кулик Алексей aka kpblc
Moderator

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


(_kpblc-conv-vla-to-list (vla-get-dimstyles *kpblc-adoc*)) - и анализируй до посинения. Хоть исходный код функции, хоть руководство по ActiveX & Co.
Ну и до кучи, чтоб не скучно было:
(mapcar (function _kpblc-conv-ent-to-ename) (_kpblc-conv-vla-to-list (vla-get-dimstyles *kpblc-adoc*)))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 18.12.2022, 06:54
#9
МишаИнженер


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
анализируй до посинения. Хоть исходный код функции, хоть руководство по ActiveX & Co.
Спасибо за подсказки!
Получился вот такой код:
Код:
[Выделить все]
 
(vl-load-com)
(defun c:DSC()
    (setq acadObj (vlax-get-acad-object))
    (setq doc (vla-get-ActiveDocument acadObj))
    (setq dimStyles (entget (vlax-vla-object->ename (vla-get-DimStyles doc))))
	(setq SpDimSylesVlaObj (mapcar (function _kpblc-conv-ent-to-ename) (_kpblc-conv-vla-to-list (vla-get-dimstyles doc))))
	(setq SpDimSyles nil)
	(foreach dimStyles SpDimSylesVlaObj
		(setq NameDS (cdr (assoc 2 (entget dimStyles))))
		(setq SpDimSyles (cons NameDS SpDimSyles)))
	(setq SpDimSyles (reverse SpDimSyles))
)


(defun _kpblc-conv-vla-to-list (value / res) ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
  (cond ((listp value) (mapcar (function _kpblc-conv-vla-to-list) value))
        ((= (type value) 'variant) (_kpblc-conv-vla-to-list (vlax-variant-value value)))
        ((= (type value) 'safearray)
         (if (>= (vlax-safearray-get-u-bound value 1) 0)
           (_kpblc-conv-vla-to-list (vlax-safearray->list value))
           ) ;_ end of if
         )
        ((and (member (type value) (list 'ename 'str 'vla-object))
              (= (type (_kpblc-conv-ent-to-vla value)) 'vla-object)
              (vlax-property-available-p (_kpblc-conv-ent-to-vla value) 'count)
              ) ;_ end of and
         (vlax-for sub (_kpblc-conv-ent-to-vla value) (setq res (cons sub res)))
         )
        (t value)
        ) ;_ end of cond
) ;_ end of defun

(defun _kpblc-conv-ent-to-ename (ent_value / _lst);|
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*  ent_value  значение, которое надо преобразовать в примитив. Может
*      быть именем примитива, vla-указателем или просто
*      списком.
*      Если не принадлежит ни одному из указанных типов,
*      возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-ename (entlast))
(_kpblc-conv-ent-to-ename (vlax-ename->vla-object (entlast)))
|;
  (cond ((= (type ent_value) 'vla-object) (vlax-vla-object->ename ent_value))
        ((= (type ent_value) 'ename) ent_value)
        ((and (= (type ent_value) 'str) (handent ent_value) (entget (handent ent_value)))
         (handent ent_value)
         )
        ((and (= (type ent_value) 'str) (handent ent_value) (tblobjname "style" ent_value))
         (tblobjname "style" ent_value)
         )
        ((and (= (type ent_value) 'str) (handent ent_value) (tblobjname "dimstyle" ent_value))
         (tblobjname "dimstyle" ent_value)
         )
        ((and (= (type ent_value) 'str) (handent ent_value) (tblobjname "block" ent_value))
         (tblobjname "block" ent_value)
         )
        ((and (= (type ent_value) 'list) (cdr (assoc -1 ent_value))) (cdr (assoc -1 ent_value)))
        (t nil)
        ) ;_ end of cond
  ) ;_ end of defun

(defun _kpblc-conv-ent-to-vla (ent_value / res);|
*    Функция преобразования полученного значения в vla-указатель.
*    Параметры вызова:
*  ent_value  значение, которое надо преобразовать в указатель. Может
*      быть именем примитива, vla-указателем или просто
*      списком.
*      Если не принадлежит ни одному из указанных типов,
*      возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-vla (entlast))
(_kpblc-conv-ent-to-vla (vlax-ename->vla-object (entlast)))
|;
  (cond ((= (type ent_value) 'vla-object) ent_value)
        ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
        ((setq res (_kpblc-conv-ent-to-ename ent_value)) (vlax-ename->vla-object res))
        ) ;_ end of cond
  ) ;_ end of defun
Конечно без подсказок самому придумать такой код, чтобы решить простую тривиальную задачу (которая в VBA или ActiveX решается одной строчкой object.DimStyles https://help.autodesk.com/view/OARX/...0-3B8040981FAA) начинающему программисту ЛИСП очень трудно! Это похоже на издевательство! Ну да ладно, главное, что код работает!
А можно ли этот код как то упростить? Что-то мне подсказывает что можно: (tblobjname "style" ent_value) (tblobjname "block" ent_value)
Следующая версия решения этой задачи должна быть более простой!

Сделал функция вывода на экран списка стилей размеров. Если выбрать в этом списке размер, то он должен стать активным:
Lisp файл:
Код:
[Выделить все]
 
(DEFUN c:DSD ( / LstDimStyles LstTextStyles); начало диалога
;Функция выводит на экран список размерных стилей и позволяет выбрать активный размерный стиль
 	(defun ReSet_plistDimStyles ()
		;Заполним список размерных стилей
		(setq LstDimStyles (GetDimStyles))
		(start_list "plistDimStyles") 
		(mapcar 'add_list LstDimStyles) 
		(end_list) 
	)

 	(defun ReSet_plistTextStyles ()
		;Заполним список размерных стилей
		(setq LstTextStyles (GetTextStyles))
		(start_list "plistTextStyles") 
		(mapcar 'add_list LstTextStyles) 
		(end_list) 
	)

	(defun SetActiveDimStyle ()
	;Функция устанавливает активный стиль размеров
	 	(setq NSt (atoi (get_tile "plistDimStyles")))
	 	(setq NameStyle (nth NSt LstDimStyles))
		(command "_-dimstyle" "_r" NameStyle);Почему здесь происходит ошибка
;;;		(setvar "DIMSTYLE" NameStyle)
	)

	(defun SetActiveTextStyle ()
	;Функция устанавливает активный стиль текста
	 	(setq NSt (atoi (get_tile "plistTextStyles")))
	 	(setq NameStyle (nth NSt LstTextStyles))
		(setvar "STYLE" NameStyle)
	)

 (defun *error* (msg)
		(princ "error: ")
		(princ msg)
	  	(terpri)
	)
	    
  ;Загрузка диалогового окна с настройками стилей черчения
	(setq dcl_id (load_dialog "DimStylesDraw.dcl"))
	(new_dialog "DimStyles_draw" dcl_id "" (list 222 114))

	(action_tile "accept" "(done_dialog 1)")
	(action_tile "cancel" "(done_dialog 0)")
	(ReSet_plistDimStyles)
;;;	(ReSet_plistTextStyles)
	(action_tile "plistDimStyles" "(SetActiveDimStyle)")
;;;	(action_tile "plistTextStyles" "(SetActiveTextStyle)")

	(setq ddi (start_dialog))

	(unload_dialog dcl_id)

  (princ)
) ; окончание функции

(defun GetDimStyles()
;Функция создает список названий размерных стилей чертежа
    (setq acadObj (vlax-get-acad-object))
    (setq doc (vla-get-ActiveDocument acadObj))
	(setq SpDimSylesVlaObj (mapcar (function _kpblc-conv-ent-to-ename) (_kpblc-conv-vla-to-list (vla-get-dimstyles doc))))
	(setq SpDimSyles nil)
	(foreach dimStyles SpDimSylesVlaObj
		(setq NameDS (cdr (assoc 2 (entget dimStyles))))
		(setq SpDimSyles (cons NameDS SpDimSyles)))
)

(defun GetTextStyles()
;Функция создает список названий текстовых стилей чертежа
    (setq acadObj (vlax-get-acad-object))
    (setq doc (vla-get-ActiveDocument acadObj))
	(setq SpTextSylesVlaObj (mapcar (function _kpblc-conv-ent-to-ename) (_kpblc-conv-vla-to-list (vla-get-TextStyles doc))))
	(setq SpTextSyles nil)
	(foreach TextStyles SpTextSylesVlaObj
		(setq NameTS (cdr (assoc 2 (entget TextStyles))))
		(setq SpTextSyles (cons NameTS SpTextSyles)))
)

(defun _kpblc-conv-vla-to-list (value / res) ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
  (cond ((listp value) (mapcar (function _kpblc-conv-vla-to-list) value))
        ((= (type value) 'variant) (_kpblc-conv-vla-to-list (vlax-variant-value value)))
        ((= (type value) 'safearray)
         (if (>= (vlax-safearray-get-u-bound value 1) 0)
           (_kpblc-conv-vla-to-list (vlax-safearray->list value))
           ) ;_ end of if
         )
        ((and (member (type value) (list 'ename 'str 'vla-object))
              (= (type (_kpblc-conv-ent-to-vla value)) 'vla-object)
              (vlax-property-available-p (_kpblc-conv-ent-to-vla value) 'count)
              ) ;_ end of and
         (vlax-for sub (_kpblc-conv-ent-to-vla value) (setq res (cons sub res)))
         )
        (t value)
        ) ;_ end of cond
) ;_ end of defun

(defun _kpblc-conv-ent-to-ename (ent_value / _lst);|
*    Функция преобразования полученного значения в ename
*    Параметры вызова:
*  ent_value  значение, которое надо преобразовать в примитив. Может
*      быть именем примитива, vla-указателем или просто
*      списком.
*      Если не принадлежит ни одному из указанных типов,
*      возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-ename (entlast))
(_kpblc-conv-ent-to-ename (vlax-ename->vla-object (entlast)))
|;
  (cond ((= (type ent_value) 'vla-object) (vlax-vla-object->ename ent_value))
        ((= (type ent_value) 'ename) ent_value)
        ((and (= (type ent_value) 'str) (handent ent_value) (entget (handent ent_value)))
         (handent ent_value)
         )
        ((and (= (type ent_value) 'str) (handent ent_value) (tblobjname "style" ent_value))
         (tblobjname "style" ent_value)
         )
        ((and (= (type ent_value) 'str) (handent ent_value) (tblobjname "dimstyle" ent_value))
         (tblobjname "dimstyle" ent_value)
         )
        ((and (= (type ent_value) 'str) (handent ent_value) (tblobjname "block" ent_value))
         (tblobjname "block" ent_value)
         )
        ((and (= (type ent_value) 'list) (cdr (assoc -1 ent_value))) (cdr (assoc -1 ent_value)))
        (t nil)
        ) ;_ end of cond
  ) ;_ end of defun

(defun _kpblc-conv-ent-to-vla (ent_value / res);|
*    Функция преобразования полученного значения в vla-указатель.
*    Параметры вызова:
*  ent_value  значение, которое надо преобразовать в указатель. Может
*      быть именем примитива, vla-указателем или просто
*      списком.
*      Если не принадлежит ни одному из указанных типов,
*      возвращается nil
*    Примеры вызова:
(_kpblc-conv-ent-to-vla (entlast))
(_kpblc-conv-ent-to-vla (vlax-ename->vla-object (entlast)))
|;
  (cond ((= (type ent_value) 'vla-object) ent_value)
        ((= (type ent_value) 'ename) (vlax-ename->vla-object ent_value))
        ((setq res (_kpblc-conv-ent-to-ename ent_value)) (vlax-ename->vla-object res))
        ) ;_ end of cond
  ) ;_ end of defun
Почему в функции SetActiveDimStyle в строке (command "_-dimstyle" "_r" NameStyle);Почему здесь происходит ошибка
Скачайте файлы lsp и dcl
Нашел код для установки активного стиля размеров:
Код:
[Выделить все]
 
	(defun SetActiveDimStyle ()
	;Функция устанавливает активный стиль размеров
	    (setq acadObj (vlax-get-acad-object))
	    (setq doc (vla-get-ActiveDocument acadObj))
	 	(setq NSt (atoi (get_tile "plistDimStyles")))
	 	(setq NameStyle (nth NSt LstDimStyles))
		(setq DimStyle (vla-Item (vla-get-DimStyles doc) NameStyle))  
		(vla-put-activeDimstyle doc DimStyle)
	)
Теперь все работает! Спасибо всем!
Вложения
Тип файла: lsp DimStylesDraw.lsp (5.5 Кб, 5 просмотров)
Тип файла: zip DimStylesDraw.zip (2.0 Кб, 6 просмотров)

Последний раз редактировалось МишаИнженер, 19.12.2022 в 10:12.
МишаИнженер вне форума  
 
Непрочитано 06.08.2023, 20:20
#10
taybac214


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


Привет!
Я получил следующую ошибку, пожалуйста, помогите
Exception in VEVAL-STR+ ARX Command
---------------------------
Unhandled Exception c0000027 (c0000027h) at address 87f22bach
---------------------------
OK
---------------------------
taybac214 вне форума  
 
Непрочитано 06.08.2023, 21:56
#11
Кулик Алексей aka kpblc
Moderator

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


Че? )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить список размерных стилей из таблицы DIMSTYLE?

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить список видовых экранов на листе? МишаИнженер Программирование 1 22.05.2020 10:44
Как настроить отображение фона текста размерных стилей в пространстве модели? Yadershick AutoCAD 0 10.03.2018 22:51
Lisp Как правильно получить список стилей ячеек табличного стиля? Kirill_Ja LISP 3 17.08.2016 17:30
Lisp: как получить список загруженных шейпов? cj_lex LISP 2 01.02.2013 14:24
Как получить Список файлов в директории (поддиректорий) VBA sf Программирование 2 17.12.2010 12:06