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

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

Как через лисп произвести быcтрый выбор объектов Project studio?

Ответ
Поиск в этой теме
Непрочитано 20.10.2014, 19:36 1 | #1
Как через лисп произвести быcтрый выбор объектов Project studio?
kurstep
 
Регистрация: 27.01.2012
Сообщений: 240

Подскажите кто сталкивался.... Необходимо во многих чертежах удалить определенное армирование сделанное объектами Проджект студио. Через меню быстрого выбора возможно выбрать определенную арматуру нужной длины... Но как можно ускорить этот процесс... То есть осуществить процесс быстрого выбора програмно через лисп?
Просмотров: 4717
 
Автор темы   Непрочитано 22.10.2014, 09:58
#2
kurstep


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


Код:
[Выделить все]
 (setq arm (vlax-ename->vla-object (entlast)))
#<VLA-OBJECT IArpsRSecEntity 000000005aed2028>
_$ (vlax-dump-object arm)
; IArpsRSecEntity: IArpsRSecEntity Interface
; Çíà÷åíèÿ ñâîéñòâ:
;   Application (RO) = Îøèáêà
;   AreaRSec (RO) = "78.5"
;   Document (RO) = #<VLA-OBJECT IAcadDocument 00000000485ff558>
;   EntityTransparency = "ÏîÑëîþ"
;   Handle (RO) = "18B7B3"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 000000006516c478>
;   Layer = "Ê_Àðìàòóðà"
;   Length = 0.0
;   LengthCalcMode = 1
;   LengthFrom = 2
;   LengthKoef = "1.00"
;   LengthNative = 0.0
;   LengthOffset = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 25.0
;   Lineweight = -1
;   Material = "ByLayer"
;   ObjectID (RO) = 45
;   ObjectID32 (RO) = 45
;   ObjectName (RO) = "ArpsRSec"
;   OwnerID (RO) = 44
;   OwnerID32 (RO) = 44
;   PlotStyleName = "ByLayer"
;   PsClassReinf = 12
;   PsDiamReinf = 10
;   PsElemType = 1
;   PsExcludeAssembling = 1
;   PsExcludeCalc = 1
;   PsKoefWeight = ""
;   PsMarka = "Íå ïðèñâîåíà"
;   PsNaim = ""
;   PsOwnerName (RO) = "Íå îïðåäåëåíà"
;   PsPosition = ""
;   PsRangeCount = Îøèáêà
;   PsRangeLen = Îøèáêà
;   PsRangeStep = Îøèáêà
;   PsRangeType = Îøèáêà
;   PsUdWeight (RO) = "0.00"
;   PsWeight (RO) = "0.00"
;   Scale = 25.0
;   TotalLength (RO) = "0.0 ïì"
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 000000006516cb30>
;   ViewRSec = 1
;   Visible = -1
T
_$
----- добавлено через ~6 мин. -----
Обнаружил что при преобразовании стержня арматуры Project Studio в объект VLA доступны все необходимые свойства (PsDiamReinf = 10) - то есть диаметр стержня....
Подскажите пожалуйста можно ли теперь програмно выбрать все стержни данного диаметра и допустим поменять диаметр на 12....
Пробовал вытащить значение диаметра через
Код:
[Выделить все]
  (setq diam (vla-get-PsDiamReinf arm))
.... ругается что функции такой нет....

Последний раз редактировалось kurstep, 22.10.2014 в 10:05. Причина: орфография
kurstep вне форума  
 
Непрочитано 22.10.2014, 10:17
#3
Кулик Алексей aka kpblc
Moderator

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


Правильно, и не будет. Потому что объекты PS - не "родные" AutoCAD'овские. Соответственно надо использовать нечто типа vlax-get-property и vlax-invoke / vlax-invoke-method
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.10.2014, 10:22
#4
kurstep


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


Спасибо за отклик, а можете более подробно пояснить или скинуть информации по пользованию этих функций?
kurstep вне форума  
 
Непрочитано 22.10.2014, 10:47
#5
Кулик Алексей aka kpblc
Moderator

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


vlax-get-property : полная форма записи функции получения свойства обьекта
(vla-get-color obj) = (vlax-get-property obj 'color) = (vlax-get-property obj "color")
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 22.10.2014, 12:45
#6
kurstep


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


Отлично!!) вывести получилось.. А vlax-invoke / vlax-invoke-method - это просто аналог vlax-get-property? И возможно ли теперь изменить значения не "родных" объектов?
kurstep вне форума  
 
Непрочитано 22.10.2014, 13:02
#7
Кулик Алексей aka kpblc
Moderator

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


vlax-invoke / vlax-invoke-method - это выполнение какого-либо "неродного" метода. К свойствам имеет весьма опосредованное отношение.
Кое-что писал тут: http://autolisp.ru/2010/11/07/invoke...d-differences/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 22.10.2014 в 14:53.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 23.10.2014, 10:18
#8
kurstep


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


Теперь пытаюсь отфильтровать объекты по свойствам....
Код:
[Выделить все]
 (entget(entlast))
((-1 . <Имя объекта: 7ffff7756a0>) (0 . "PS_RSEC") (330 . <Имя объекта: 7ffffa239f0>) (5 . "BDC7A") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "К_Арматура") (48 . 25.0) (100 . "AcDbCircle") (10 -74050.0 78492.7 0.0) (40 . 5.0) (210 0.0 0.0 1.0))
- Это свойства круглых стержней... они мне как раз и нужны... Думал что все легко пройдет через
Код:
[Выделить все]
  (ssget "_x" '((100 . "AcDbCircle")))
Но обнаружил что код не работает...видимо потому что DXF 100 встречается в списке 2-ды... , то есть получается через entget данный стержни не отфильтровать, и как возможно что 100 встречается дважды?
kurstep вне форума  
 
Непрочитано 23.10.2014, 11:02
#9
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Попробуй фильтровать по '((0 . "PS_RSEC"))
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 23.10.2014, 11:10
#10
kurstep


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


Да, спасибо, сработало
Код:
[Выделить все]
 (sssetfirst nil (ssget "_x" '((0 . "PS_RSEC"))))
-выбор всех поперечных стержней

----- добавлено через ~13 мин. -----
И теперь чтобы изменить , например, диаметр стержня я должен запустить цикл
Код:
[Выделить все]
 while(< counter (sslength mysset))
по количеству объектов в группе и для каждого объекта произвести перевод в VLA и сделать vlax-put-property?

----- добавлено через ~10 ч. -----
Может кто-нибудь помочь с кодом выбора всех стержней диаметра 12 и поменять их на 16?...
kurstep вне форума  
 
Автор темы   Непрочитано 24.10.2014, 13:15
#11
kurstep


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


Код:
[Выделить все]
 (vl-load-com)
  (defun pl_st (/ model)
  (setq model (vla-get-ModelSpace
                (vla-get-ActiveDocument (vlax-get-acad-object))))

       (vlax-for i model

        (if  (= "ArpsReinf" (vlax-get-property i "ObjectName"))
		 		 (vla-Delete i))))
Пытаюсь разобратся... Почему не работает данный код?
kurstep вне форума  
 
Непрочитано 24.10.2014, 14:21
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Может всё-таки "ArpsRSec", а не "ArpsReinf"?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 24.10.2014, 14:47
#13
kurstep


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


Я экспериментирую с разными объектами PS... не удаляется ничего)... Я думаю может просто объекты Проджект студио не относятся к (acad-object)... Может кто знает есть способ узнать адрес выделенного объекта в Иерархии ACTIVEX?
kurstep вне форума  
 
Непрочитано 24.10.2014, 17:39
#14
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от kurstep Посмотреть сообщение
Я думаю может просто объекты Проджект студио не относятся к (acad-object)...
Относятся. Преобразуй i из vla-object в ename и воспользуйся функцией (entdel) для удаления.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 24.10.2014, 17:58
#15
kurstep


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


Код:
[Выделить все]
 (vl-load-com)
 (defun pl_st (/ model)
 (setq model (vla-get-ModelSpace
               (vla-get-ActiveDocument (vlax-get-acad-object))))

      (vlax-for i model

       (if  (= "ArpsReinf" (vlax-get-property i "ObjectName"))
	 		 entdel(vlax-vla-object->ename i))))
Программа выдала -
Код:
[Выделить все]
ActiveX Server возвратил ошибку: Элемент не найден
kurstep вне форума  
 
Непрочитано 24.10.2014, 18:02
#16
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Проверь скобки.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 24.10.2014, 18:13
#17
kurstep


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


Спасибо, удаление свершилось!!
Код:
[Выделить все]
 (vl-load-com)
 (defun pl_st (/ model)
 (setq model (vla-get-ModelSpace
               (vla-get-ActiveDocument (vlax-get-acad-object))))

      (vlax-for i model

       (if  (= "ArpsReinf" (vlax-get-property i "ObjectName"))
	 		 (entdel(vlax-vla-object->ename i)))))
----- добавлено через ~5 мин. -----
.....Хотя рано радоваться... один вызов команды удаляет один объект...Т.е программа видимо прерывается...
kurstep вне форума  
 
Непрочитано 24.10.2014, 18:53
#18
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от kurstep Посмотреть сообщение
.....Хотя рано радоваться... один вызов команды удаляет один объект...Т.е программа видимо прерывается...
Собери в этом цикле в список все ename для всех объектов ArpsReinf, а потом во втором цикле по списку ename удаляй их при помощи (entdel)
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 24.10.2014, 19:51
#19
kurstep


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


Что-то я совсем чайник по этим делам.... не понимаю как собрать ename в список....
kurstep вне форума  
 
Непрочитано 24.10.2014, 21:38
#20
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,408
Отправить сообщение для Александр Ривилис с помощью Skype™


Ну как-то так:
Код:
[Выделить все]
 (vl-load-com)
(defun pl_st (/ model names)
(setq model (vla-get-ModelSpace
            (vla-get-ActiveDocument (vlax-get-acad-object))))
     (vlax-for i model
      (if  (= "ArpsReinf" (vlax-get-property i "ObjectName"))
 		 (setq names (cons (vlax-vla-object->ename i) names))))
     (foreach i names (entdel i))
)

Последний раз редактировалось Александр Ривилис, 25.10.2014 в 13:17.
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как через лисп произвести быcтрый выбор объектов Project studio?

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
Аттестация в Минрегионе по негосударственной экспертизе Людмила Охр Прочее. Архитектура и строительство 350 14.02.2015 17:50