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

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

Autolisp. Entmod

Ответ
Поиск в этой теме
Непрочитано 21.12.2010, 14:56
Autolisp. Entmod
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, подскажите каким образом вытащенное значение из объекта и поменяное воткнуть назад. Т.е. нужно модифицировать объект. У меня лвполилиния, получаю я ее значение высоты, вот так:

Код:
[Выделить все]
(setq ov (entsel "Тыкай на линию или <Enter>: "))
  (setq ov1 (ssget "l"))
  (setq ob (entget (ssname ov1 0)))
  (setq lob (cdr (assoc 0 ob)))
  (if (equal lob "LWPOLYLINE")
    (setq prob1 (cdr (assoc 38 ob)))
    (progn
       (setq ob (entget (entnext (cdr (car ob)))))
       (setq prob1 (cdr (assoc 10 ob)))
       (setq prob1 (nth 2 prob1))
    )
  )
Т.е. в OB имею развернутый список, все свойства линии, в prob1 я вытащил значение высоты. Дальше я меняю значение высоты и как мне теперь воткнуть это новое значение назад в этот список и поменять свойства линии. Уже пробовал такое с атрибутами блоков, так работает, ребята помогли, а с простым не могу допереть. Помоги уже разобраться окончательно. ВСЕМ СПАСИБО ЗАРАНЕЕ!
Просмотров: 6131
 
Непрочитано 11.01.2011, 14:57
#21
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Zaghim Посмотреть сообщение
А можно попросить пример для 3dpolyline, с остальным, думаю, разбирусь, пожааааалста)))
Код:
[Выделить все]
; 3dpoly_obj - примитив 3dpolyline, полученный, например (car (entsel))
; new_level - новый уровень

; Пример вызова: (test (car (entsel)) 48)


(defun test(3dpoly_obj new_level / vertex ed_vertex z)
  (if (= (cdr (assoc 0 (setq ed_vertex (entget (setq vertex (entnext 3dpoly_obj)))))) "VERTEX")
    (while (and vertex (/= (cdr (assoc 0 ed_vertex)) "SEQEND"))
      (setq z (cdr (assoc 10 ed_vertex)))
      (entmod (subst (cons 10 (list (car z) (cadr z) new_level)) (assoc 10 ed_vertex) ed_vertex))
      (setq vertex (entnext vertex))
      (if vertex
        (setq ed_vertex (entget vertex))
        )
      )
    )
  (princ)
  ); end test
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 11.01.2011, 15:28
#22
Zaghim


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


А можно впихнуть сразу в это:
Код:
[Выделить все]
 (_dwgru-ent-modify-autoregen (entsel) 38 nvis nil)

 (defun _dwgru-ent-modify-autoregen (ent       bit       value     ent_regen
                                    /         ent_list  new_dxf   old_dxf
                                    )
  (if
    (and
      (setq ent (_dwgru-conv-ent-to-ename ent))
      (not (or (member bit '(-1 0 5 100)) ;_ есть и другие DXF-коды, ковыряться в которых не надо
               (member (strcase (cdr (assoc 0 (setq ent_list (entget ent)))))
                       '("STYLE" "DIMSTYLE" "LAYER")
                       ) ;_ end of member
               (equal (setq new_dxf (cons bit
                                          (if (and (= bit 62) (= (type value) 'str))
                                            (if (= (strcase value) "BYLAYER")
                                              256
                                              0
                                              ) ;_ end of if
                                            value
                                            ) ;_ end of if
                                          ) ;_ end of cons
                            ) ;_ end of setq
                      (setq old_dxf (assoc bit ent_list))
                      ) ;_ end of equal
               ) ;_ end of or
           ) ;_ end of not
      ) ;_ end of and
     (if (entmod (if old_dxf
                   (subst new_dxf old_dxf ent_list)
                   (append ent_list (list new_dxf))
                   ) ;_ end of if
                 ) ;_ end of entmod
       (if ent_regen
         (entupd ent)
         (redraw ent)
         ) ;_ end of if
       ) ;_ end of if
     ) ;_ end of if
  ent
  ) ;_ end of defun


(defun _dwgru-conv-ent-to-ename (ent / ret)
 
  (cond
    ((= (type ent) 'vla-object) (vlax-vla-object->ename ent))
    ((= (type ent) 'ename) ent)
    ((= (type ent) 'str) (handent ent)) ;;;((= (type ent) 'str) (handent str))
((and (= (type ent) 'list)                   
       (= (type (setq ret (car ent))) 'ename) 
       )                                      
  ret                                         
  )                                           
 ((= (type ent) 'list)(cdr (assoc -1 ent)))   
    (t nil)
    ) ;_ end of cond
  ) ;_ end of defun
Что бы один раз ткнуть, определить лв это полилиния или 3д, а потом соответственно вызывать разные функции.

В общем сделал проверку таким образом:
Код:
[Выделить все]
(setq ov (entsel "Тыкай на линию или <Enter>: "))
  (setq ov1 (ssget "l"))
  (setq ob (entget (ssname ov1 0)))
  (setq lob (cdr (assoc 0 ob)))
  (if (or (equal lob "LWPOLYLINE") (equal lob "POLYLINE"))
    (setq metka1 1)
    (setq metka1 2)
  )
Но тут засада. Почему-то 3дполилиния и обычная полилиния определяются просто как LINE. Не пойму как их отличить?!?!?!
А теперь они все POLYLINE, что за хрень?

Последний раз редактировалось Zaghim, 11.01.2011 в 16:33.
Zaghim вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autolisp. Entmod



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AutoLisp и база данных SQL-сервера Макс_Кунгур LISP 83 25.06.2019 12:00
Считывание значение ячейки таблицы в виде Field в AutoLISP tokhot LISP 9 08.01.2017 17:54
Как отладить нейтив и менеджед код в COM объекте который используется из AutoLISP? lexluther LISP 1 12.08.2009 08:37
Программа для отрисовки подшипников в AutoLisp IZH LISP 20 11.01.2009 11:13
Не понимаю почему не работает _Intersect (AutoLISP) silic LISP 3 09.12.2008 21:21