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

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

Autolisp. Entmod

Ответ
Поиск в этой теме
Непрочитано 21.12.2010, 14:56 #1
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 я вытащил значение высоты. Дальше я меняю значение высоты и как мне теперь воткнуть это новое значение назад в этот список и поменять свойства линии. Уже пробовал такое с атрибутами блоков, так работает, ребята помогли, а с простым не могу допереть. Помоги уже разобраться окончательно. ВСЕМ СПАСИБО ЗАРАНЕЕ!
Просмотров: 6130
 
Непрочитано 21.12.2010, 15:07
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Чтобы поменять значение DXF пары - старое тебе в общем-то и не нужно:
Код:
[Выделить все]
((lambda (ent-list)
          (entmod (subst (cons xxx new-value) (assoc xxx ent-list) ent-list)))
 (entget ent))
где xxx DXF код пары, new-value - желаемое новое значение.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 21.12.2010 в 15:31.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.12.2010, 15:16
#3
Zaghim


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


Т.е. в первом случае это 38, во втором 10, я правильно понял?
И что есть ent-list и ent
Zaghim вне форума  
 
Непрочитано 21.12.2010, 15:29
#4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


ent - ename примитива (у тебя оно получается через (ssname ov1 0), но обычно, для одиночного выбора используют (car (entsel)), (entlast), (entnext)), все остальное - вымышленные имена. Где (и кто) у меня "первый" и "второй" случай - не понял уже я, так-же, как и то, что ты хочешь сделать с 10 и 38 кодами.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 21.12.2010, 16:55
#5
Zaghim


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


Не так написал. Т.е. получится

((lambda (ob)
(entmod (subst (cons 38 prob2) (assoc prob2 ob) ob)))
(entget ob))

38 - это код высоты, который я получаю и который мне нужно изменить и воткнуть назад.
Zaghim вне форума  
 
Непрочитано 21.12.2010, 16:56
#6
Лиспер


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


http://forum.dwg.ru/showthread.php?t=15670
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 22.12.2010, 10:25
#7
Zaghim


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


Не понял я как эта функция работает....
вызываю так:
(_dwgru-ent-modify (entsel) 38 251 T)

и пишет, что не определена функция

; error: no function definition: _DWGRU-CONV-ENT-TO-ENAME

Последний раз редактировалось Zaghim, 22.12.2010 в 10:34.
Zaghim вне форума  
 
Непрочитано 22.12.2010, 10:39
#8
Лиспер


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


_dwgru-conv-ent-to-ename
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 22.12.2010, 10:53
#9
Zaghim


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


Всему надо тыкать пальцем
Сейчас отработала, но значение линии не присвоила
Zaghim вне форума  
 
Непрочитано 22.12.2010, 11:00
#10
Лиспер


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


Стоп - линии (LINE) или полилинии (LWPOLYLINE)?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 22.12.2010, 11:01
#11
Zaghim


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


У меня может быть несколько вариантов...
Может быть POLYLINE, LWPOLYLINE и 3DPOLYLINE
Zaghim вне форума  
 
Непрочитано 22.12.2010, 11:06
#12
Лиспер


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


38 код есть только у LWPOLYLINE, насколько я помню. Какой должен быть эффект по замене необрабатываемого кода?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 22.12.2010, 17:40
#13
Zaghim


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


Хм, а как тогда быть с другими? Я пробовал брать просто линию, и мнять в ней цвет, как в примере. Никакого эффекта(((
Zaghim вне форума  
 
Непрочитано 23.12.2010, 00:56
#14
Кулик Алексей aka kpblc
Moderator

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


Цвет регулируется 62 кодом, а не 38. Посмотри в DXF Reference.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.12.2010, 06:44
#15
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Никакого эффекта
Не забывай после любых модификаций делать entupd
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 11.01.2011, 10:50
#16
Zaghim


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


Друзья, всех с Новым Годом. Тема осталась актуальна. Сейчас код в таком виде:

Код:
[Выделить все]
(_dwgru-ent-modify-autoregen (entsel) 62 10 nil)

  
 ; (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))
 ;   )
 ; )

)

 (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)
  (cond
    ((= (type ent) 'ename) ent)
    ((= (type ent) 'vla-object) (vlax-vla-object->ename ent))
    ((= (type ent) 'str) (handent ent))
    (t nil)
    ) ;_ end of cond
  ) ;_ end of defun
и есть лвполилиния. Тыкаю на нее и должен по идеи измениться цвет, но никакого эффекта. А вообще мне нужно изменять по такому принципу:

1) Если LWPOLYLINE - изменить значение Elevation
2) Если 3DPOLYLINE - изменить значение Z
Zaghim вне форума  
 
Непрочитано 11.01.2011, 12:11
#17
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Что-то не вижу связи между цветом и Elevation+Z...
А цвет не меняется потому, что, для начала, надо брать функцию _dwgru-conv-ent-to-ename не из первого а из второго сообщения этой темы.
Do$ вне форума  
 
Автор темы   Непрочитано 11.01.2011, 13:12
#18
Zaghim


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


С цветом - это для того, что бы понять работает эта штука или нет. А вот с высотами буду думать дальше... как узнать какая линия это понятно, нужно просто менять разные dxf-коды, верно?
Zaghim вне форума  
 
Непрочитано 11.01.2011, 14:05
#19
TararykovDG

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


Цитата:
Сообщение от Zaghim Посмотреть сообщение
С цветом - это для того, что бы понять работает эта штука или нет. А вот с высотами буду думать дальше... как узнать какая линия это понятно, нужно просто менять разные dxf-коды, верно?
Несовсем верно.
Чтобы поменять цвет, нужно поменять 62 dxf-код.
Чтобы поменять Elevation (для lwpolyline) нужно помнять 38 dxf-код.
А вот для 3dpolyline нужно менять 10 dxf-коды, но не для самого 3dpolyline? а для примитивов vertex, которые получают entnext'ом от 3dpolyline
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 11.01.2011, 14:19
#20
Zaghim


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


А можно попросить пример для 3dpolyline, с остальным, думаю, разбирусь, пожааааалста)))

Последний раз редактировалось Zaghim, 11.01.2011 в 14:29.
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