внешние процедуры с (command "_.explode")
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > внешние процедуры с (command "_.explode")

внешние процедуры с (command "_.explode")

Ответ
Поиск в этой теме
Непрочитано 09.10.2006, 17:12 #1
внешние процедуры с (command "_.explode")
Mr_Eugene
 
инженер-проектировщик
 
Москва.Терна
Регистрация: 05.10.2006
Сообщений: 33

Граждане, памагите!

Чего-то я туплю...

Есть у меня две программки, которые ищут каждая свой тип объекта на чертеже, помещают в набор, подсвечивает его, разбивают через (command "_.explode")
ну и типа отчета выдает через princ

каждая в отдельности работает замечательно

понадобилось вызвать их из третьей программки
вызываю:
первая проходит нормально
вторая при (command "_.explode") выдают ошибку
*Invalid selection*
Expects a point or Last/ALL/Group
; error: Function cancelled

ощущение такое, что первая прога "не отпускает" командную строку...

вобщем спасайте
полдня ковыряюсь уже
объесните тупому че нетак...
Просмотров: 6231
 
Непрочитано 09.10.2006, 17:16
#2
Кулик Алексей aka kpblc
Moderator

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


Вполне возможно, кстати. Код обеих покажи. Так-то можно что угодно насоветовать
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.10.2006, 17:44
#3
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


первая ищет и разбивает объекты от СПДС и GeoniCS

Код:
[Выделить все]
(defun c:findspds (/
		  nabor003
		   len
		   ii
		   im
		   prov
		   nabor004)

  (setq nabor003 (ssget "_A"))
  (setq nabor004 (ssadd))
  (if (= nabor003 nil) (setq i "Объекты не найдены")
     (progn
        (setq ii 0)
        (setq len (sslength nabor003))
        (repeat len
	   (setq getprim (ssname nabor003 ii))	
	   (setq ii (1+ ii))
	   (setq im (cdr (assoc 0 (entget getprim))))

           (setq prov (wcmatch im "spds*,mcs*,GC*"))
 	   (if prov (ssadd getprim nabor004))
	 );repeat
     );progn
    );if
   (setq len (sslength nabor004))
   (if (ssname nabor004 0)
     (progn
        (SSSETFIRST nil nabor004)
        (command "_.explode")
     )
     ;progn
   )
   (princ (strcat "Найдено и разбито " (itoa len) " GC- и SPDS-объектов"))
   (princ)
 );defun

вторая ищет и разбивает все DIMENSIONS


Код:
[Выделить все]
(defun c:explodim (/
		 nabdim
		 nabor001
		 nabor002a
		 nabor002b
		 len
		 ii
		 getprim
		 dimvla
		 jj
		 qq
		 )
   (setq nabor002a (ssadd))
   (setq nabor002b (ssadd))
   (setq nabor001 (ssget "_X" '((0 . "DIMENSION"))))
   (if (= nabor001 nil) (princ "Объекты DIMENSION не найдены")
      (progn
	 (setq ii 0)
	 (setq jj 0)
         (setq qq 0)
	 (setq len (sslength nabor001)) 
         (repeat len
            (setq getprim (ssname nabor001 ii))
            (setq ii (1+ ii))
            (setq dimvla (vlax-ename->vla-object getprim))	    
            (setq nabdim (VL-CATCH-ALL-APPLY 'vla-Move (list dimvla (vlax-3d-point 0 0 0) (vlax-3d-point 0 0 0))))
 ;тест-перемещение с контролем ошибки на случай заблокированного слоя
	    (if (vl-catch-all-error-p nabdim)
                   (setq nabor002b (ssadd getprim nabor002b))
                   (setq nabor002a (ssadd getprim nabor002a))	           
	    )
            
	   
         );repeat

 	 (if (ssname nabor002a 0)
           (progn
              (SSSETFIRST nil nabor002a)
              (command "_.explode")
	   );progn
         ); if

         (terpri)
         (princ (strcat "Найдено" (itoa len) " размер(а, ов)."))
         (terpri)
         (princ (strcat (itoa (sslength nabor002a)) " размер(а, ов) разбито. " (itoa (sslength nabor002b)) " на заблокированных слоях."))
         (princ)
	
      ); progn
   ); if

   (princ)
  
);  defun
Mr_Eugene вне форума  
 
Непрочитано 09.10.2006, 18:05
#4
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>Mr_Eugene
Сомнительное решение:
Код:
[Выделить все]
(if (ssname nabor002a 0)
    (progn
        (SSSETFIRST nil nabor002a)
        (command "_.explode")
    ) ;progn 
) ; if
На мой взгляд так будет получше:
Код:
[Выделить все]
(if (ssname nabor002a 0)
     (VL-CMDF "_.explode" nabor002a)
)
AY вне форума  
 
Автор темы   Непрочитано 09.10.2006, 18:20
#5
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


to AY:

да я вроде пробовал так...
тока удаляется один примитив из набора
сам удивляюсь почему
Mr_Eugene вне форума  
 
Непрочитано 09.10.2006, 18:27
#6
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>Mr_Eugene

Чудес тут не бывает. Куда от может удаляться? Это происходит всегда? Может этот объект не в текущем пространстве ...
AY вне форума  
 
Непрочитано 10.10.2006, 08:17
#7
Кулик Алексей aka kpblc
Moderator

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


Спробуй такое (не проверял, поэтому ничего гарантировать не могу):
Код:
[Выделить все]
(defun modexpl (lst /)
  (foreach item (vl-remove-if-not
                  '(lambda (x y)
                     (wcmatch (strcase (cdr (assoc 0 (entget x)))) (strcase y))
                     ) ;_ end of lambda
                  (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_A"))))
                  lst
                  ) ;_ end of vl-remove-if-not
    (vl-catch-all-apply
      '(lambda ()
         (command "_.explode" item)
         (while (/= (getvar "cmdactive") 0)
           (command "")
           ) ;_ end of while
         ) ;_ end of lambda
      ) ;_ end of vl-catch-all-apply
    ) ;_ end of foreach
  ) ;_ end of defun

(defun c:explspds (/ adoc)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (modexpl '("SPDS*" "*MCS*" "GC*"))
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

(defun c:expldim (/ adoc)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark adoc)
  (modexpl '("DIMENSION"))
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.10.2006, 10:12
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Вот здесь чего-то накрутил
Код:
[Выделить все]
(vl-remove-if-not 
                  '(lambda (x y) 
                     (wcmatch (strcase (cdr (assoc 0 (entget x)))) (strcase y)) 
                     ) ;_ end of lambda 
                  (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_A")))) 
                  lst 
                  ) ;_ end of vl-remove-if-not
Так работает. Проверял с размерами и регионами
Код:
[Выделить все]
(defun modexpl (lst / lay lays lock)
(setq lays (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
(foreach item (vl-remove-if-not '(lambda (x) 
                (wcmatch (strcase (cdr (assoc 0 (entget x)))) (strcase lst)))
		(vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_A")))))
  
 (setq lay (vla-item lays (vla-get-layer (vlax-ename->vla-object item))))
 (if (= (vla-get-lock lay) :vlax-true)
  (progn (vla-put-lock lay :vlax-false) (setq lock (cons lay lock))))
(vl-catch-all-apply 
      '(lambda ()(command "_.explode" item) 
         (while (/= (getvar "cmdactive") 0)(command ""))))
 (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-explode (list item))))
  (vla-Delete item))
  ) ;_ end of foreach
 (if lock (foreach x lock (vla-put-lock x :vlax-true)))
  ) ;_ end of defun 

(defun c:explspds (/ adoc) 
  (vl-load-com) 
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))) 
  (vla-startundomark adoc) 
  (modexpl '"SPDS*,*MCS*,GC*") 
  (vla-endundomark adoc) 
  (princ) 
  ) ;_ end of defun 

(defun c:expldim (/ adoc) 
  (vl-load-com) 
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))) 
  (vla-startundomark adoc) 
  (modexpl '"DIM*") 
  (vla-endundomark adoc) 
  (princ) 
  ) ;_ end of defun
VVA вне форума  
 
Автор темы   Непрочитано 10.10.2006, 12:08
#9
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


Уфф!
вроде заработало

СПАСИБО ВСЕМ!!!

to AY:
виноват, некорректно выразился
если не подсвечивать набор, а указывать его напрямую для "_.explode", то из всего набора обрабатывается только один объект

to kpblc, VVA:
еще раз спасибо!
немного круто для меня, но, вобщем вроде разобрался
тока подскажите в чем все-таки фишка была?
(command "") не хватало?
Mr_Eugene вне форума  
 
Непрочитано 10.10.2006, 12:48
#10
Кулик Алексей aka kpblc
Moderator

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


По идее да. Просто лично у меня это стандартное завершение работы (command)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2006, 13:53
#11
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


kpblc,
а вариант, который AY предложил, должен работать нормально?
а то обрабатывается только один объект из набора... :cry:
Mr_Eugene вне форума  
 
Непрочитано 10.10.2006, 14:29
#12
AY

webcad.pro
 
Регистрация: 06.01.2005
Московская обл.
Сообщений: 501


>Mr_Eugene
По идее должен, но фактически действительно не работает (может "глюк", а может "фича"), я с подобным раньше не сталкивался. Прошу извинить за введение в заблуждение.
AY вне форума  
 
Автор темы   Непрочитано 10.10.2006, 14:33
#13
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


Цитата:
Сообщение от AY
>Mr_Eugene
По идее должен, но фактически действительно не работает (может "глюк", а может "фича"), я с подобным раньше не сталкивался. Прошу извинить за введение в заблуждение.
меня самого смущает вариант с sssetfirst
похоже из-за него крючит мой код, а по-другому мне ничего в голову не приходит
Mr_Eugene вне форума  
 
Непрочитано 10.10.2006, 14:49
#14
Кулик Алексей aka kpblc
Moderator

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


Не в курсе. Полещук в своей последней книге очень хорошо сказал (правда, относилось это к ActiveX-наборам, но я так же поступаю и для ssget-наборов): "Если с набором планируются какие бы то ни было действия - удаление, например, или разбиение примитивов, то крайне желательно набор преобразовывать в список объектов и работать уже со списком".
За точность цитаты не ручаюсь.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2006, 15:11
#15
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


to kpblc:

вобщем, да, согласен конечно...

но у меня в файле объектов для разбиения несколько тысяч
больно долго их из списка по одному вытягивать и грохать

набором существенно быстрее...
тока вот никак не разберусь что там происходит разбиения первого набора... только командная строка блокируется.. толи подсвеченый набор глючит.... :cry:
Mr_Eugene вне форума  
 
Непрочитано 10.10.2006, 15:19
#16
Кулик Алексей aka kpblc
Moderator

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


Ну и что, что несколько тысяч? Я особых тормозов не ожидаю, если честно. У тебя преобразование набора в список выполняется одной строкой:
Код:
[Выделить все]
(vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_A"))))
Если ухитришься туда добавить фильтры по типу и пространству, то будет совсем здорово.
В твоем изначальном варианте можно попробовать сделать по такой логике:
1. Выполнить _zoom _all
2.
Код:
[Выделить все]
(SSSETFIRST nabor002a nabor002a)
        (command "_.explode" "")
3. Вернуть _zoom
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2006, 15:59
#17
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33


ща попробую

а насчет тормозов:
минуты три обрабатываются объекты если по-одному грохать - немного утомительно

когда разбивка идет набором, то акад предлагает для ускорения процесса выполнить "Disregard Draw Order". Если согласиться, то получается секунд за 25
Mr_Eugene вне форума  
 
Непрочитано 10.10.2006, 16:13
#18
Кулик Алексей aka kpblc
Moderator

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


Я не очень понимаю, зачем писать лиспы для разбития СПДСовских объектов, если у самой СПДС-ки есть спец.средство для разбития (работает, правда, только н активном пространстве). Насчет смысла разбития размеров тоже не очень догоняю.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.10.2006, 17:06
#19
Mr_Eugene

инженер-проектировщик
 
Регистрация: 05.10.2006
Москва.Терна
Сообщений: 33



по-поводу зачем:
файлы нам присылают заказчики
задача - закатать то, что прислали в нашу систему
(предварительно подготовив естессно)
у нас СПДС и GeoniCS нету
графический импорт в нашу систему кушает только ограниченный набор типов объектов, куда входят только линии, дуги, окружности, все виды полилиний, ну и полимеш еще, ну и текст еще можно запихать

вроде заморочились совершенствовать конвертер - но до этого еще дожить надо...

вот так и живем

[/code]
Mr_Eugene вне форума  
 
Непрочитано 10.10.2006, 17:09
#20
Кулик Алексей aka kpblc
Moderator

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


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