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

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

Вопрос по AutoLisp!!!

Ответ
Поиск в этой теме
Непрочитано 16.09.2004, 17:13 #1
Вопрос по AutoLisp!!!
mihael_b
 
geodezist
 
israel
Регистрация: 07.09.2004
Сообщений: 28

Вопрос такой, есть блок с аттрибутами ->
Command: li
LIST 1 found

BLOCK REFERENCE Layer: "0"
Space: Model space
Handle = 231D
"TRP0601"
at point, X=176899.5790 Y=584989.6020 Z= 231.1720
X scale factor 0.5000
Y scale factor 0.5000
rotation angle 0
Z scale factor 0.5000

ATTRIBUTE Layer: "0"
Space: Model space
Handle = 231E
Style = "TRHEBTXT"
Font file = hebtxt.shx
substituted by simplex.shx
top/center point, X=176899.5687 Y=584989.0943 Z= 231.1720
height 0.6350
value \U+2022\U+2019
tag MARK
rotation angle 0
width scale factor 1.0000
obliquing angle 0
flags preset
generation normal

ATTRIBUTE Layer: "0"
Space: Model space
Handle = 231F
Style = "TRHEBTXT"
Font file = hebtxt.shx
substituted by simplex.shx
bottom/center point, X=176899.5790 Y=584991.6520 Z= 231.1720
height 0.9000
value 528E
tag NAME
rotation angle 0
width scale factor 1.0000
obliquing angle 0
flags preset
generation normal

ATTRIBUTE Layer: "0"
Space: Model space
Handle = 2320
Style = "TRHEBTXT"
Font file = hebtxt.shx
substituted by simplex.shx
end point, X=176901.3656 Y=584988.5106 Z= 231.1720
height 0.8000
value 231.17
tag HIGHTM
rotation angle 0
width scale factor 1.0000
obliquing angle 0
flags preset
generation normal

ATTRIBUTE Layer: "0"
Space: Model space
Handle = 2321
Style = "TRHEBTXT"
Font file = hebtxt.shx
substituted by simplex.shx
start point, X=176902.8656 Y=584988.5106 Z= 231.1720
height 0.8000
value
tag HIGHTC
rotation angle 0
width scale factor 1.0000
obliquing angle 0
flags preset
generation normal

END SEQUENCE Layer: "1LINE_TREES"
Space: Model space
Handle = 2322


мешает вот этот END SEQUENCE Layer: "1LINE_TREES"
т.е. когда я меняю слой этого блока меняются и слои аттрибутов кроме вот этого END SEQUENCE Layer: "1LINE_TREES", как с этим можно побороться? Хотелось бы чтобы когда я меняю слой блока менялись и слои всех аттрибутов.
Просмотров: 3700
 
Автор темы   Непрочитано 16.09.2004, 17:24 Вру
#2
mihael_b

geodezist
 
Регистрация: 07.09.2004
israel
Сообщений: 28
<phrase 1=


Вру, слои аттрибутов тоже не меняются. Вообщем можно-ли поменять слой и блоку и всем его аттрибутам сразу.[/u]
mihael_b вне форума  
 
Непрочитано 16.09.2004, 17:54
#3
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Попробуй функцию entmod или свойсто Layer менять. А чтоб сразу всем... Ну надо в список собрать все примитивы, которые нужно изменить и применить функцию к списку. Что то вроде
(mapcar '(lambda (x) (vla-put-layer (vlax-ename->vla-object x) "имя_слоя")) list_of_ent)
vk вне форума  
 
Непрочитано 16.09.2004, 18:15
#4
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,189
<phrase 1=


Возможно, я не так понял вопрос, но, при смене слоя блока слои примитивов входящих в блок тоже не меняются, также как и атрибутов (что ессесно). Однако видимостью и свойствами примитивов и атрибутов в блоке можно управлять если они созданы на слое "0".
а END SEQUENCE - это не атрибут, в смысле примитива, это специальный примитив используемый совместно с атрибутом - что это и нафига, врать не буду, сам не знаю.
Apelsinov вне форума  
 
Непрочитано 16.09.2004, 18:33
#5
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Тоже сходу неврубился в вопрос. Так что все таки нужно? Как на AutoLISP изменить слой атрибутов блока или готовая прога. Такая есть http://dwg.ru/dwl/index.php?id=121 и не только для слоев. Если нужно объяснение этой процедуры, это тоже можно.
{Smirnoff} вне форума  
 
Непрочитано 16.09.2004, 19:01
#6
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Цитата:
END SEQUENCE - это не атрибут, в смысле примитива, это специальный примитив используемый совместно с атрибутом - что это и нафига, врать не буду, сам не знаю.
Этот примитив, также известный как SEQEND указывает что закончено описание какого либо сложного (комплексного) примитива (в данном случае INSERT и несколько относящихся к нему ATTRIBUTE) и следующим будет другой примитив, не относящийся к предыдущему. Что то вроде конца группы.
Кстати, он применяется и в 2д и в 3д полилиниях. Аналогичная вещица есть и в описании блока (ENDBLOCK).
vk вне форума  
 
Непрочитано 16.09.2004, 19:16
#7
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Ну вот типа "синхронизация" слоев всех атрибутов со слоем блока.
Код:
[Выделить все]
(defun c:lch ()
  (vl-load-com)
  (if
    (and
  (setq Block(vlax-ename->vla-object
	       (car(entsel "Select block"))))
  (=(vla-get-ObjectName Block) "AcDbBlockReference")
  (=(vla-get-HasAttributes Block):vlax-true)
     ); end and
    (progn
      (setq blLay(vla-get-Layer Block)
            attList(vlax-safearray->list
		    (vlax-variant-value
		     (vla-getAttributes Block))))
      (foreach i attList
	(vla-put-Layer i blLay)
	); end foreach
      ); end progn
    ); end if
  (princ)
  ); end defun
{Smirnoff} вне форума  
 
Непрочитано 16.09.2004, 19:17
#8
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Пардон. Все переменные локальные.
{Smirnoff} вне форума  
 
Непрочитано 16.09.2004, 19:26
#9
Alaspher


 
Сообщений: n/a


Как вариант:
Код:
[Выделить все]
(defun pl:chng-bl-lay (bl lay / lst stop)
  (setq lst (list (entget bl))
        key (cdr (assoc -1 (car lst)))
  ) ;_ end of setq
  (if (not (zerop (cdr (assoc 66 (car lst)))))
    (while (and (not stop) (setq bl (entnext bl)))
      (setq lst (cons (entget bl) lst))
      (if (and (= "SEQEND" (cdr (assoc 0 (car lst))))
               (= key (cdr (assoc 330 (car lst))))
          ) ;_ end of and
        (setq stop t)
      ) ;_ end of if
    ) ;_ end of while
  ) ;_ end of if
  (foreach ent lst
    (entmod (subst (cons 8 lay) (assoc 8 ent) ent))
    (entupd (cdr (assoc -1 ent)))
  ) ;_ end of foreach
  (princ)
) ;_ end of defun

;;; (pl:chng-bl-lay (car (entsel)) "NewLay")
DXF, в данном случае прдпочтительней, поскольку при отсутствии указанного слоя, он создаётся автоматически, в отличие от варианта с ActiveX. Проверка на принадлежность SEQEND сделана для подстраховки (кто знает, что ещё Autodesk с DXF накрутит).
 
 
Непрочитано 16.09.2004, 19:28 Поправка
#10
Alaspher


 
Сообщений: n/a


Первая строка кода должна быть такой:
Код:
[Выделить все]
(defun pl:chng-bl-lay (bl lay / lst stop key)
...
упустил одну локальную
 
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Вопрос по AutoLisp!!!

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск