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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выбор узловых выносок СПДС (SpdsNoteKnot) по образцу текущей выделенной.

Выбор узловых выносок СПДС (SpdsNoteKnot) по образцу текущей выделенной.

Ответ
Поиск в этой теме
Непрочитано 25.11.2008, 13:07
Выбор узловых выносок СПДС (SpdsNoteKnot) по образцу текущей выделенной.
Baldares
 
Саратов
Регистрация: 17.10.2008
Сообщений: 426

Привет.

Вот эта задачка может стать для меня основой для освоения Лиспа.
Потомучто на VBA до dxf кодов добираться все равно через него. А еще и гемор по пути схватишь.

Прошу накидать пример. Пожалуйста. А я еге изучу )))

Цель. Выделить выноски по образцу выдбранной.

Я представляю себе такие действия:
1. Получить верхнюю стороку текущей выбранной выноски. Т.е. предпологается что перед стартом команды - выделена выноска (по которой и нужно будет выделить все выноски на чертеже в model_space, с таким же текстом).
2. Перебрать модель и занести в набор все выноски с таким же текстом.
3. Подсветить набор.

Вот что у меня есть пока. - Был бред, удалил.

Готовый лисп см. #51

Последний раз редактировалось Baldares, 27.11.2008 в 14:37.
Просмотров: 18786
 
Непрочитано 26.11.2008, 20:41
#41
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Baldares
Как раз этим Я изанимался, пытался определть то чку вставки выноски и потом менять в ней текст, поменять текст получаетлось нормально, а вот определить точку вствки ну ни как.
Кстати вспомнил с какими арх объектами у меня получался вылет автокада, при ихменении свойств через dxf, это были арматурные стержни PS-конструкции
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM на форуме  
 
Автор темы   Непрочитано 27.11.2008, 10:33
#42
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Ой косяк.

В vba Формирую список выносок на чертеже. Объект выноски определяю по ObjectName = "mcsDbObjectNoteKnot", а имя выноски определяю через лисповскую функцию. В цикле по перебору объектов модели, каждую выноску заношу в набор "Выноска" и для нее в лиспе определяю имя и заношу в Users1.
Вчерась работало нормально.
Сегодня такая ерунда при выполнении:
Код:
[Выделить все]
Команда: (set-spdsNoteKnotName-to-Users1)
_users1
Новое значение USERS1, или . если нет <"16">: 16
Команда: -VBARUN
Имя макроса: nil

Имя макроса:
>>Имя макроса:
Имя макроса:
>>Имя макроса:
Имя макроса:
>>Имя макроса:
Имя макроса:
>>Имя макроса:
Имя макроса:
Это при выполнении макроса!
Какое еще имя макроса он запрашивает и с чего?

Вот сама функция:
определение имени выноски из набора "Выноска", и запись его в Users1.
Код:
[Выделить все]
(defun set-spdsNoteKnotName-to-Users1 ( / selSets selSpdsNode objSpdsNode SpdsNodeName)
  	(vl-load-com)
	(setq selSets (vla-get-SelectionSets (vla-get-ActiveDocument (vlax-get-acad-object))))
	; получаем набор, созданный в VBA
	(setq selSpdsNode (vla-item selSets "Выноска"))
	; получаем объект выноски. (в наборе только один объект)
	(setq objSpdsNode (vla-item selSpdsNode 0))
	;переводим объект в примитив
	(setq objSpdsNode (vlax-vla-object->ename objSpdsNode))
	; получаем значение 300 кода
	(setq SpdsNodeName (cdr (assoc 300 (member '(301 . "Номер узла") (entget objSpdsNode)))))
	; записываем значение в сис.переменную
	(command "_users1" SpdsNodeName "")
)
Чую я дров наломал.
Baldares вне форума  
 
Автор темы   Непрочитано 27.11.2008, 10:37
#43
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Вот примерно такой макрос.
Код:
[Выделить все]
For Each objEnt In ThisDrawing.ModelSpace 
 If objEnt.ObjectName = "mcsDbObjectNoteKnot" Then
   Set objEnt(0) = objEnt
   selSetNode.AddItems varEnt
   ThisDrawing.SendCommand "(set-spdsNoteKnotName-to-Users1)" & vbCr
 End If
Next
Baldares вне форума  
 
Автор темы   Непрочитано 27.11.2008, 11:20
#44
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Кажется здесь загвоздка:
Код:
[Выделить все]
(command "_users1" SpdsNodeName "")
Тут что-то не так?
Baldares вне форума  
 
Автор темы   Непрочитано 27.11.2008, 11:25
#45
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Если так то все пучком.
Код:
[Выделить все]
(command "_users1" SpdsNodeName)
Baldares вне форума  
 
Автор темы   Непрочитано 27.11.2008, 11:31
#46
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Теперь как бы скрыть требуху из командной строки.
CMDECHO 0 поставить?
Но где? В vba перед вызовом SendComand, или в лиспе.

Цитата:
Справочник команд AutoCAD 2008 > Системные переменные > Системные переменные С > CMDECHO >
CMDECHO

Тип: Целый
Сохранен в: Не сохранен
Начальное значение: 1

Управляет дублированием подсказок и ввода при выполнении команды AutoLISP.

0 - Выключение повтора

1 - Включение повтора
И еще, на всякий пожарный. Ведь нормальной работе в акакде CMDECHO=0, не особо мешает. Или нет.
Просто в случае "чп" она может остаться в 0.
Baldares вне форума  
 
Автор темы   Непрочитано 27.11.2008, 12:00
#47
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


А чтоб и команды не писались в ком.строке, есть сис.переменная?
Baldares вне форума  
 
Непрочитано 27.11.2008, 12:05
#48
Кулик Алексей aka kpblc
Moderator

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


Для случая "ЧП" надо переопределять обработчик ошибок. В лиспе это решается одними методами, в VBA - другими (см. On Error)
№43: А зачем ты для каждого объекта вызываешь лисп? По-моему, все можно решить значительно проще: в форме ты показываешь критерии отбора, например, а потом запускаешь уже лисп для показа набора.
И, кстати, установить системную переменную можно и без SendCommand
VBA: ThisDrawing.SetVariable
LISP: setvar
В конце лиспа ставь (princ) и будет тебе "тихий" выход.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.11.2008, 12:37
#49
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Кулик Алексей aka kpblc, я отошел в сторону от начальной темы, с ней вопрос решен твоим лиспом. Теперь решаю новую задачу. Но тему не стал создовать. А ты не отвлекаешься от темы не при каких условиях).
Похоже нужно все-таки создать тему.

Короч. Она близка к этой.
"Выделение узловых выносок из списка имен всех выносок на чертеже." Вот.
В vba формирую массив по типу имя выноски и к нему коллекция самих примитивов. И так для каждого имени выноски.
Имя выноски определяю в лиспе.
Потом чел выбрал нужное имя выноски в списке и нажал "Выделить"
Ну я и передаю набор примитивов для этого имени выноски в лисп, где и подсвечиваю его.
Но уже тоже решилась, остались мелкие нюансы. Которые и спрашиваю.

На счет подавления команд в ком.строке.
При вызове лисп функции:
Код:
[Выделить все]
ThisDrawing.SendCommand "(set-spdsNoteKnotName-to-Users1)" & vbCr
В ком.строке остается строка вида:
Код:
[Выделить все]
Команда: (set-spdsNoteKnotName-to-Users1)
Вот ее бы убрать.
Baldares вне форума  
 
Непрочитано 27.11.2008, 13:09
#50
Кулик Алексей aka kpblc
Moderator

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


cmdecho, nomutt, menuecho - меняй и потом обратно не забудь вернуть
Кстати, я вынужден вообще за всеми темами следить. Должность такая
---
Добавлено: поищи на форуме vlax.cls - он, насколько я помню, позволяет передавать данные VBA <-> Lisp напрямую. Может, его использование решит твою проблему.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 27.11.2008, 14:35
#51
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Для результата темы.

Лисп от Кулик Алексей aka kpblc, из #22, жирным отмечены изменения.
Код:
[Выделить все]
(defun spds-node-select-like (lst             /
                              fun_conv-selset-to-ename        fun_get-node
                              fun_get-sheet   fun_get-scale   fun_get-adress
                              obj             obj_layer       obj_node
                              obj_sheet       obj_adress      obj_scale
                              selset          ent             obj_lst
                              res
                              )
                             ;|
*    Выбор "такой же" узловой выноски СПДС GraphiCS по списку критериев.
*    Параметры вызова:
	lst	список вида
	 '("layer"	; наличие слова указывает, что надо учитывать объекты,
	 		; лежащие на таком же слое
	   "node"	; то же, по номеру узла (в терминологии СПДС)
	   "sheet"	; то же, номеру листа
	   "adress"	; то же, адрес
	   "scale"	; фильтровать по масштабу объекта
	   )
*    Формируется набор только по пространству, в котором лежит "определяющий" объект
*    Примеры вызова:
(spds-node-select-like nil)	; выбрать вообще все.
(spds-node-select-like '("layer")) ; выбрать выноски, лежащие на том же
				; слое, что и "родитель"
(spds-node-select-like '("node"))
(spds-node-select-like '("node" "layer"))
|;

  (defun fun_conv-selset-to-ename (selset / tab item)
    (cond
      ((not selset) nil)
      ((= (type selset) 'pickset)
       (repeat (setq tab  nil
                     item (sslength selset)
                     ) ;_ end setq
         (setq tab (cons (ssname selset (setq item (1- item))) tab))
         ) ;_ end repeat
       )
      ((listp selset) selset)
      ) ;_ end of cond
    ) ;_ end of defun

  (defun fun_get-node (ent_lst)
    (cdr (assoc 300 (member '(301 . "Номер узла") ent_lst)))
    ) ;_ end of defun

  (defun fun_get-sheet (ent_lst)
    (cdr (assoc 300 (member '(301 . "Номер листа") ent_lst)))
    ) ;_ end of defun

  (defun fun_get-adress (ent_lst)
    (cdr (assoc 300 (member '(301 . "Адрес узла") ent_lst)))
    ) ;_ end of defun

  (defun fun_get-scale (ent_lst)
    (cdr (assoc 40 (member '(301 . "Scale") ent_lst)))
    ) ;_ end of defun
  
(vl-load-com)
  (setq lst (mapcar (function strcase) lst))
  (if (and (= (type (setq obj (vl-catch-all-apply
                                (function
                                  (lambda ()
                                    (ssget "_:E:S")
                                    ) ;_ end of lambda
                                  ) ;_ end of function
                                ) ;_ end of vl-catch-all-apply
                          ) ;_ end of setq
                    ) ;_ end of type
              'pickset
              ) ;_ end of =
           (setq obj (ssname obj 0))
           (= (cdr (assoc 0 (entget obj))) "spdsNoteKnot")
			  (setq selset (ssget "_X" (list (assoc 410 (entget obj))
												(cons -4 "<NOT")
             								(cons 0 "*LINE,*TEXT,*INSERT,CIRCLE,ARC,ELLI*,DIM*,*IM?G*,AEC_*,HATCH")
             								(cons -4 "NOT>")
             								) ;_ end of list
           					) ;_ end of ssget
  				) ;_ end of set
      ) ;_ end of and
    (progn
      (setq obj_lst    (entget obj)
            obj_layer  (if (member "LAYER" lst)
                         (cdr (assoc 8 obj_lst))
                         ) ;_ end of if
            obj_node   (if (member "NODE" lst)
                         (cdr (assoc 300 (member '(301 . "Номер узла") obj_lst)))
                         ) ;_ end of if
            obj_sheet  (if (member "SHEET" lst)
                         (cdr (assoc 300 (member '(301 . "Номер листа") obj_lst)))
                         ) ;_ end of if
            obj_adress (if (member "ADRESS" lst)
                         (cdr (assoc 300 (member '(301 . "Адрес узла") obj_lst)))
                         ) ;_ end of if
            obj_scale  (if (member "SCALE" lst)
                         (cdr (assoc 40 (member '(301 . "Scale") obj_lst)))
                         ) ;_ end of if
            obj_lst    (vl-remove-if-not
                         (function
                           (lambda (x / _lst)
                             (setq _lst (entget x))
                             (and (= (cdr (assoc 0 _lst)) "spdsNoteKnot")
										 	 (if obj_layer
                                    (= (cdr (assoc 8 _lst)) obj_layer)
                                    t
                                    ) ;_ end of if
                                  (if obj_node
                                    (= (fun_get-node _lst) obj_node)
                                    t
                                    ) ;_ end of if
                                  (if obj_sheet
                                    (= (fun_get-sheet _lst) obj_sheet)
                                    t
                                    ) ;_ end of if
                                  (if obj_adress
                                    (= (fun_get-adress _lst) obj_adress)
                                    t
                                    ) ;_ end of if
                                  (if obj_scale
                                    (= (fun_get-scale _lst) obj_scale)
                                    t
                                    ) ;_ end of if
                                  ) ;_ end of and
                             ) ;_ end of lambda
                           ) ;_ end of function
                         (fun_conv-selset-to-ename selset)
                         ) ;_ end of vl-remove-if-not
            res        (ssadd)
            ) ;_ end of setq
      (foreach item obj_lst
        (setq res (ssadd item res))
        ) ;_ end of foreach
      (sssetfirst res res)
      res
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
Цитата:
Добавлено: чуток фантазии и можно добавить практически все что угодно )
Baldares вне форума  
 
Непрочитано 29.11.2008, 13:01
#52
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Вопросик немного не по теме
С помощью вот этого лиспика можно изменять текст в маркере
Код:
[Выделить все]
(defun C:примитив (/ SL1 SL2)
(setq SL1 (entsel "Выберете объект:  "))
(setq SL2 (entget (car SL1)))
(princ)
(setq SL1 (cadr (member '(301 . "1pos") SL2)))
(setq SL2 (subst '(300 . "thtyj") SL1 SL2))
(entmod SL2)
)
Попытка с помощью него же изменить точку вставки маркера не увенчалась, вот пробный код
Код:
[Выделить все]
(defun C:примитив (/ SL1 SL2)
(setq SL1 (entsel "Выберете объект:  "))
(setq SL2 (entget (car SL1)))
(princ)
(setq SL1 (cadr (member '(301 . "Origin point X:") SL2)))
(setq SL2 (subst '(40 . 0.0) SL1 SL2))
(entmod SL2)
)
Хотя функция возвращает измененные значения

Может еще есть какой нибудь вариант измнения точки вставки маркера.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM на форуме  
 
Автор темы   Непрочитано 29.11.2008, 13:38
#53
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


DEM, а кинь сам маркер для примера. Для 4 СПДС. 5ки нету.
Baldares вне форума  
 
Автор темы   Непрочитано 29.11.2008, 13:57
#54
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Вот такая штука да.
Код:
[Выделить все]
Выберите объект: ((-1 . <Имя объекта: 7efb4540>) (0 . "mcsDbObject") (330 . 
<Имя объекта: 7efb2cf8>) (5 . "1E0") (100 . "AcDbEntity") (67 . 0) (410 . 
"Model") (8 . "0") (100 . "mcsDbObject") (100 . "mcsDbObject") (90 . 1) (301 . 
"Name") (300 . "Новый маркер") (301 . "Info") (300 . "Новый 
маркер\nПанель\tН5\n") (301 . "Scale") (40 . 1.0) (301 . "MarkerType") (300 . 
"Новый маркер") (301 . "Панель") (300 . "Н5") (301 . "Origin point X:") (40 . 
1578.42) (301 . "Origin point Y:") (40 . 701.169))
Код:
[Выделить все]
; Поддерживаемые методы:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Copy ()
;   Delete ()
;   GetBoundingBox (2)
;   GetExtensionDictionary ()
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetXData (2)
;   TransformBy (1)
;   Update ()

Последний раз редактировалось Baldares, 29.11.2008 в 14:04.
Baldares вне форума  
 
Непрочитано 29.11.2008, 15:47
#55
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Baldares
Угу
Я вот и думаю что если уж с программным созданием выносок не получантся, то можно с маркерами по работать.
Учитывая что у аркеров возможностей по более.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM на форуме  
 
Автор темы   Непрочитано 29.11.2008, 16:03
#56
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


DEM, скинь файл в котором позициипроставлены с пом. этих маркеров. Для 4-ки если есть. Не пойму как с их помощью позиции простовлять. У мну получился маркер в виде линии и над ним имя маркера. Но такой для позиций не пойдет. Скинь шоб не париться.
А демка для пятки есть у них. Щас поищу.
Baldares вне форума  
 
Непрочитано 29.11.2008, 16:17
#57
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Да ты создай свой маркер в СПДС 4.0 там все просто.
Вот с ним и побалуйся.
А 5,0 вроде уже поправили на следующей неделе переставлю.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM на форуме  
 
Автор темы   Непрочитано 29.11.2008, 16:47
#58
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Просто-да не просто. Жадина-говядина
Baldares вне форума  
 
Непрочитано 29.11.2008, 16:49
#59
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Baldares
Дык 4-ку снес не заново её ставить же.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM на форуме  
 
Автор темы   Непрочитано 29.11.2008, 18:46
#60
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Поставил пятку. Ни одного отличия не нашел от 4-ки. Бред.
DEM, через мове попробуй.
Код:
[Выделить все]
(vl-load-com)
(defun C:marker-move-to0 (/ entMark lstMark objMark ptX ptY 3DptO 3DptXY)
(setq entMark (car (entsel "Выберете маркер:")))
(setq lstMark (entget entMark))
(setq objMark (vlax-ename->vla-object entMark))
(setq ptX (cdadr (member '(301 . "Origin point X:") lstMark)))
(setq ptY (cdadr (member '(301 . "Origin point Y:") lstMark)))
(setq 3DptXY (vlax-3d-point ptX ptY 0))
(setq 3DptO (vlax-3d-point 0 0 0))
(vla-Move objMark 3DptXY 3DptO)
)
Это так набросок. Я не шарю в лиспе. Могу косяков наплодить.
Baldares вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Выбор узловых выносок СПДС (SpdsNoteKnot) по образцу текущей выделенной.

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование данных для спецификаций из выносок СПДС в таблицу из мтекстов Red Nova Программирование 177 08.12.2008 11:35