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

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

Выбор всех объектов на слое с присвоением типа линии

Ответ
Поиск в этой теме
Непрочитано 15.11.2022, 06:20 #1
Выбор всех объектов на слое с присвоением типа линии
Nikilin
 
Регистрация: 28.10.2019
Сообщений: 57

Здравствуйте.
Возникла задача выбрать объекты на нескольких слоях "l1, l2" и присвоить всем объектам в слое тип линии и толщину 1.
Пытался что то найти но все без результата.
Я так понимаю решения в параметрах
(vla-put-LineType obj "ByLayer")
(vla-put-LineWeight obj -1)
но как сделать выбор всех объектов на 2 слоях через ActiveX я не понимаю.
Обработчики включен или выключен слой не нужен. Я их уже принудительно включил ранее по коду.

Последний раз редактировалось Nikilin, 15.11.2022 в 06:29.
Просмотров: 5301
 
Непрочитано 15.11.2022, 08:44
#2
Кулик Алексей aka kpblc
Moderator

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


А обязательно через ActiveX? Ты что, собираешься работать в неактивном документе?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.11.2022, 08:54
#3
Nikilin


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


Необязательно. lisp должен работать только в активном файле. Просто к командам через ActiveX привязался так как несведущий в данных вопросах. Нуб редкостный. Через простые пути не получилось решить, стал усложнять.
_chprop не работал на тестах
вполне возможно из за неверного выбора через
(setq sl (ssget "_X" '((8 . "l1"))))

Последний раз редактировалось Nikilin, 15.11.2022 в 09:00.
Nikilin вне форума  
 
Непрочитано 15.11.2022, 10:50
1 | #4
Кулик Алексей aka kpblc
Moderator

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


Не советую использовать командные методы. А так, в качестве первой прикидки:
Код:
[Выделить все]
 (defun t1 (/ adoc)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for ent (vla-get-modelspace adoc)
    (if (wcmatch (strcase (vla-get-layer ent)) "LAYER1*,*1")
      (progn
        (vla-put-lineweight ent aclnwtbylayer)
        (vla-put-color ent 1)
        (vla-put-linetype ent "bylayer")
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
) ;_ end of defun
По идее надо еще отслеживать состояние слоев, писать обработку ошибок - но мне пока что лениво
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 15.11.2022, 12:14
#5
Nikilin


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


Все отлично работает. Спасибо. Но как всегда бывают моменты.
При изменения кода
Код:
[Выделить все]
 (if (wcmatch (strcase (vla-get-layer ent)) "1*,*2")
к примеру на
Код:
[Выделить все]
 (if (wcmatch (strcase (vla-get-layer ent)) "ИИ ЛИНИИ ТОНКИЕ СПЛОШНЫЕ*,*ИИ ЛИНИИ ТОЛСТЫЕ ПУНКТИРНЫЕ")
Код перестает работать. Ошибок Автокад не показывает. Кодировка ANSI.
С чем связано не пойму. Если слой на английском или цифрами то все работает
Nikilin вне форума  
 
Непрочитано 15.11.2022, 12:41
1 | #6
Кулик Алексей aka kpblc
Moderator

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


Советую посмотреть на описание функции wcmatch и все что с нею связано.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 16.11.2022, 04:53
#7
Nikilin


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Советую посмотреть на описание функции wcmatch и все что с нею связано.
Спасибо. Хоть и с трудом но разобрался. Примеров мало нашел, может плохо искал.
Код работает шикарно. Мои задачи выполнил полностью.
Nikilin вне форума  
 
Автор темы   Непрочитано 17.12.2022, 18:40
#8
Nikilin


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


Опять уперся в стену. Не могу додуматься как выделить не все объекты в слоях а только мултилинии и блоки
если оставить строчку
(if (wcmatch (strcase (vla-get-layer ent)) "ПП*"))
Nikilin вне форума  
 
Непрочитано 17.12.2022, 18:52
#9
Кулик Алексей aka kpblc
Moderator

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


Проверяй vla-get-objectname

----- добавлено через ~8 мин. -----
Offtop: Есть еще один вариант, но тебе он не понравится: понадобится всю мою библиотеку таскать.
Если работать в текущем документе:
Код:
[Выделить все]
 (setq layer_status (_kpblc-layer-status-save-by-list nil nil nil))
(foreach ent (_kpblc-conv-selset-to-vla (ssget "_X" '((67 . 0) (0 . "INSERT,MLINE"))))
  (vla-put-lineweight ent aclnwtbylayer)
  (vla-put-color ent 1)
  (vla-put-linetype ent "bylayer")
) ;_ end of foreach
(_kpblc-layer-status-restore-by-list nil nil layer_status)
Если не в текущем (doc - указатель на документ):
Код:
[Выделить все]
 (setq layer_status (_kpblc-layer-status-save-by-list doc nil nil))
(vlax-for ent (vla-get-modelspace doc)
  (vla-put-lineweight ent aclnwtbylayer)
  (vla-put-color ent 1)
  (vla-put-linetype ent "bylayer")
) ;_ end of foreach
(_kpblc-layer-status-restore-by-list doc nil layer_status)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 17.12.2022, 19:39
#10
Nikilin


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
vla-get-objectname
Если честно не понял как поможет. В учебниках по этой функции очень мало информации.
Да и скорей всего я опять не верно поставил задачу.
По сути хочу оставить этот код
Код:
[Выделить все]
 (defun t1 (/ adoc)
  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (vlax-for ent (vla-get-modelspace adoc)
    (if (wcmatch (strcase (vla-get-layer ent)) "LAYER1*,*1")
      (progn
                   (vla-put-XScaleFactor ent 1)
                   (vla-put-YScaleFactor ent 1)
                   (vla-put-ZScaleFactor ent 1)
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
) ;_ end of defun
Но выбирать в слоях только блоки после чего задать масштаб по Х Y Z =1

По сути хочу задать Лиспом масштаб "1" для блоков в слоях с определённым прификсом.

----- добавлено через ~22 мин. -----
Если я правильно понял то vla-get-objectname позволяет сравнивать имена объектов.

Последний раз редактировалось Nikilin, 17.12.2022 в 19:45.
Nikilin вне форума  
 
Непрочитано 17.12.2022, 21:02
#11
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Nikilin Посмотреть сообщение
Но выбирать в слоях только блоки
(and <...> (= (vla-get-objectname ent) "AcDbBlockReference")))
Как пример. Пишу без ACAD'a
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.12.2022, 21:06
#12
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


Код:
[Выделить все]
 (setq block_sset (ssget "_x" '((0 . "insert") (8 . "LAYER1*,*1"))))
(while (not (zerop (sslength block_sset)))
  	(vla-put-XScaleFactor (setq block_object (vlax-ename->vla-object (setq block_entity (ssname block_sset 0)))) 1)
  	(vla-put-YScaleFactor block_object 1)
  	(vla-put-ZScaleFactor block_object 1)
  	(ssdel block_entity block_sset) 
)  
__________________
K Lisp
koMon вне форума  
 
Непрочитано 17.12.2022, 21:11
#13
Кулик Алексей aka kpblc
Moderator

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


Offtop: Последнее время не люблю работать с pickset'ами без крайней на то необходимости. С чего, почему - не знаю.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.12.2022, 21:16
#14
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


Offtop: необъяснимая неприязнь?
как-то лучше, чем молотить всю базу
__________________
K Lisp
koMon вне форума  
 
Непрочитано 17.12.2022, 22:41
#15
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от koMon Посмотреть сообщение
Offtop: необъяснимая неприязнь?
как-то лучше, чем молотить всю базу
Просто нередко приходится разрабатывать код, который работает с неактивным документом. А там интерактивность идет лесом.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.12.2022, 14:06
#16
Nikilin


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


в процессе пришел к такому варианту.
Код:
[Выделить все]
  (defun c:blockscale05 (/ ss i sn obj)
  (vl-load-com)
  (if (setq ss (ssget "_X" '((0 . "insert") (8 . "ПП*"))))
    (repeat (setq i (sslength ss))
      (setq sn (ssname ss (setq i (1- i))))
      (setq obj (vlax-ename->vla-object sn))
             (vla-put-XScaleFactor obj 0.5)
             (vla-put-YScaleFactor obj 0.5)
             (vla-put-ZScaleFactor obj 0.5)
    )
  )
  (princ)
) 
Но появилась новая идея и опять стена из за недостатка знаний.
Можно ли вытащить значение из масштаба аннотации ???
Допустим стоит масштаб 1:500 где соотношение 1:0.5 и необходимо вытащить и присвоить переменной именно 0.5???
Nikilin вне форума  
 
Непрочитано 19.12.2022, 14:26
#17
Кулик Алексей aka kpblc
Moderator

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


Можно, наверное. А кто мешает изначально использовать аннотативные объекты?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.12.2022, 14:38
#18
Nikilin


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


Подскажите на сколько сложно извлечь переменную? Если сложно то плюну на все и буду использовать аннотативные блоки.
А мешает по сути увеличение блоков.
Конкретно при передачи чертежей заказчику и получая его обратно, не раз обращал внимание на то, что часто они некорректно работают с чертежами.
Чаще всего его масштабируют на 1000, потом добавляют аннотацию 1:1000 и получился блок в 1000 раз больше нужного. Короче лучшая защита от дурака с ручным масштабированием, это если блоки не аннотативны.

Последний раз редактировалось Nikilin, 19.12.2022 в 14:46.
Nikilin вне форума  
 
Непрочитано 19.12.2022, 14:46
1 | 1 #19
Кулик Алексей aka kpblc
Moderator

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


Пишу без acad'a:
Код:
[Выделить все]
(mapcar
 (function
   (lambda(x)
    (setq x (entget x))
    (mapcar (function (lambda(a) (cdr(assoc a x))) '(300 140 141))
   )
  )
(vl-remove-if-not (function (lambda(x) (=(car x)350))) (dictsearch(nameobjdict)"acad_scalelist"))
Плюс-минус так. Если я правильно понял вопрос
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.12.2022, 15:36
1 | 1 #20
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,817


namedobjdict
__________________
K Lisp
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Выбор всех объектов на слое с присвоением типа линии



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Стандартная черточка для типа линии "сварка" и "разрыв" МишаИнженер AutoCAD 6 06.05.2022 07:15
Как настроить опцию типа линий "Масштаб в единицах пространства листа" для всех листов? Сет AutoCAD 2 24.03.2022 11:18
Как назначить масштаб типа линии из свойств блока? МишаИнженер AutoCAD 6 18.02.2022 15:30
Как задать постоянный масштаб типа линии во внешней ссылки, не изменяемый при обновлении ссылки? FLEX11 AutoCAD 2 20.05.2021 14:15