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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Draw Order в Visual Lisp

Draw Order в Visual Lisp

Ответ
Поиск в этой теме
Непрочитано 11.09.2007, 13:55 #1
Draw Order в Visual Lisp
TheBuTeK
 
преподавание
 
Москваград
Регистрация: 28.09.2005
Сообщений: 131

По идее этот код должен переносить отрезки на задний план, но он этого не делает, потому что (vla-sendcommand i "_draworder _b ") ругается на i.
Может быть, есть решения попроще и понадежнее?

Код:
[Выделить все]
...
(setq pt-list nil)                
     (if (setq nbl(ssget '((0 . "line,spline")))); (cons -4 "<not") (cons -4 "<and") '(8 . "0") '(8 . "Equip*") (cons -4 "and>") (cons -4 "not>")))) ;,lwpolyline
            (progn 
                   (setq nbl (mapcar 'vlax-ename->vla-object 
                               (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbl))) 
                            )
               );setq 
                   (foreach i nbl
                      (setq sx (car (vlax-curve-getstartpoint i))
                          sy (cadr (vlax-curve-getstartpoint i))
                          ex (car (vlax-curve-getendpoint i))
                          ey (cadr (vlax-curve-getendpoint i)))
                      (if (< (abs(- ex sx)) (abs(- ey sy)))
                           
                           (vla-sendcommand i "_draworder _b  ")
                           (vla-sendcommand i "_draworder _f  "))
...
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
Просмотров: 3629
 
Непрочитано 11.09.2007, 14:09
#2
Кулик Алексей aka kpblc
Moderator

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


Попробуй использовать вместо i либо (vlax-vla-object->ename i), либо (handent (vla-get-handle i))
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.09.2007, 14:18
#3
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Увы, результат такой же, ругается на объект:
; error: bad argument type: VLA-OBJECT <Entity name: 7efa6068>

А вообще, можно ли задать порядок прорисовки через свойство объекта, а не командой "draworder"?
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 11.09.2007, 14:45
#4
Кулик Алексей aka kpblc
Moderator

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


Поскольку все равно используются командные методы, кто мешает делать так:
Код:
[Выделить все]
(defun test (/ ss)
  (if (setq ss (ssget "_:L" '((0 . "LINE,SPLINE"))))
    (foreach item (mapcar 'vlax-ename->vla-object
                          (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
                          ) ;_ end of mapcar
      (command "_.draworder" (vlax-vla-object->ename item) "" "_f")
      (while (/= (logand (getvar "cmdactive") 31) 0)
        (vla-sendcommand "")
        ) ;_ end of while
      ) ;_ end of foreach
    ) ;_ end of if
  ) ;_ end of defun
:?:
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.09.2007, 15:00
#5
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Как то так можно:
Код:
[Выделить все]
(defun demo (/ adoc dict nbl sort)
    (setq adoc (vla-get-activedocument (vlax-get-acad-object))
          dict (vla-getextensiondictionary (pl:get-active-space adoc))
          sort (vl-catch-all-apply (function vla-getobject) (list dict "ACAD_SORTENTS"))
    )
    (vla-startundomark adoc)
    (if (vl-catch-all-error-p sort)
        (setq sort (vla-addobject dict "ACAD_SORTENTS" "AcDbSortentsTable"))
    )
    (if (setq nbl (ssget '((0 . "line,spline"))))
        (progn (setq nbl (mapcar 'vlax-ename->vla-object
                                 (vl-remove-if 'listp (mapcar 'cadr (ssnamex nbl)))
                         )
               )
               (vla-movetobottom
                   sort
                   (vlax-safearray-fill
                       (vlax-make-safearray vlax-vbobject (cons 0 (1- (length nbl))))
                       nbl
                   )
               )
        )
    )
    (vla-endundomark adoc)
    (princ)
)

(defun pl:get-active-space (doc)
    (if (and (zerop (vla-get-activespace doc)) (= :vlax-false (vla-get-mspace doc)))
        (vla-get-paperspace doc)
        (vla-get-modelspace doc)
    )
)
Alaspher вне форума  
 
Непрочитано 11.09.2007, 15:03
#6
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


или так:

Код:
[Выделить все]
(defun c:test (/ ss)
 (if (setq ss (ssget '((0 . "LINE,SPLINE"))))
  (progn (SSSETFIRST nil ss) (AI_DRAWORDER "_f"))
 ) ;_  if
)
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 11.09.2007, 15:16
#7
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Огромное спасибо всем!
ai_draworder - это пожалуй, самое логичное решение!
Впрочем, вариант alaspher'а тоже по своему хорош, рассмотрю потом и его!
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 11.09.2007, 15:26
#8
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от TheBuTeK
Впрочем, вариант alaspher'а тоже по своему хорош, рассмотрю потом и его!
Хочется добавить, что этот вариант очень хорош, если есть объект-словарь "ACAD_SORTENTS". У меня есть подобный код, но там идет проверка на версию автокада, те. в старых версиях нету метода vla-movetobottom и подобных, а так же проверка на наличие словаря "ACAD_SORTENTS". Если есть и словарь и версия подходящая, то я использую объектные методы, а если нет, то ai_draworder...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 11.09.2007, 17:28
#9
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Еще один вопрос из той же оперы, чтобы не создавать новую тему.

Имеется vla-object, прочитанный из некоего списка объектов. Требуется работать с этими объектами при помощи стандартных команд AutoCAD. Вообще возможно ли это и если да - то как? Или во что их следует преобразовывать для использования стандартными командами?

То есть у меня есть прямая i из набора, но на запрос команды (напр. _ERASE) я не могу непосредственно задать ей, чтобы она удалила i, поскольку мне сообщают о недопустимости выбора этого объекта.
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 11.09.2007, 17:39
#10
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


тогда преобразуй свой объект в dxf имя или в набор выделения...
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 11.09.2007, 17:49
#11
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


А как получить из набора vla-объектов набор выделения?
Или проще сделать набор выделения из отдельного vla-объекта?
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Автор темы   Непрочитано 11.09.2007, 18:04
#12
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Виноват.
Команда vlax-vla-object->ename ....
Читаю книгу - источник знаний.
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 13.09.2007, 12:03
#13
Wo1and


 
Регистрация: 12.09.2007
СтолидЦа
Сообщений: 7
<phrase 1=


воопчем в результате вот чего вышло
Код:
[Выделить все]
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< DrawOrder

(defun drorder (sss / point1 point2 ss sx sy ex ey temp temp1 gor)
  	(if (= (last sss) nil) 
	(progn
		(if (and (setq point1 (getpoint)) (setq point2 (getcorner point1)))
		(progn
			(if (setq sss (ssget "_w" point1 point2 '((0 . "line,spline")))) 
			(progn
				(setq sss (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex sss)))))
			));progn if
		));progn if
	));progn if
	(setq gor (ssadd))
  	(foreach ss sss
		(setq sx (car (vlax-curve-getstartpoint ss))
			sy (cadr (vlax-curve-getstartpoint ss))
			ex (car (vlax-curve-getendpoint ss))
			ey (cadr (vlax-curve-getendpoint ss)))
		(if (< (abs(- ex sx)) (abs(- ey sy))) 			
			(progn	(setq temp1 (vlax-vla-object->ename ss) 	;если вертикальная 
			   	temp (ssadd temp1))
				(SSSETFIRST nil temp) (command "_DRAWORDER" "_b"))
	  		(progn (setq temp1 (vlax-vla-object->ename ss)) 		;если горизонтальная 
			   	(ssadd temp1 gor))
		);if
  	);foreach
;переносим наверх все что не наше

  	(if (setq sss (ssget "_x" '((0 . "wipeout"))))(progn
		(SSSETFIRST nil sss) (command "_DRAWORDER" "_f"))
  	); if

	(if (/= gor nil) (progn
	  (SSSETFIRST nil gor) (command "_DRAWORDER" "_f"))
	);if
	
	(if (setq sss (ssget "_x" '((-4 . "<not") (0 . "line,spline,block,mtext,text,wipeout") (-4 . "not>"))))(progn
		(SSSETFIRST nil sss) (command "_DRAWORDER" "_f"))
  	); if

  	(if (setq sss (ssget "_x" '((0 . "insert"))))(progn
		(SSSETFIRST nil sss) (command "_DRAWORDER" "_f"))
  	); if
  
	(if (setq sss (ssget "_x" '((0 . "mtext,text"))))(progn
		(SSSETFIRST nil sss) (command "_DRAWORDER" "_f"))
  	); if
  
  
);defun
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DrawOrder[code][/code]
__________________
Самурай без меча подобен самураю с мечом, тока без меча.
Wo1and вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Draw Order в Visual Lisp

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