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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Entmod может работать на прямую со списком введенным вручную?

Entmod может работать на прямую со списком введенным вручную?

Ответ
Поиск в этой теме
Непрочитано 06.12.2016, 19:27 #1
Entmod может работать на прямую со списком введенным вручную?
oleg_marshinov
 
Регистрация: 27.01.2009
Сообщений: 31

Не смог найти сам, сори если плохо искал.
почему так не работает (через замену программно assoc все ок) , но почему нельзя изменить список вручную?
(entmod '((-1 . <Имя объекта: 7eeaa808>))) (0 . "CIRCLE") (330 . <Имя объекта: 7ee9fcf8>) (5 . "1429") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbCircle") (10 167.154 435.169 0.0) (40 . 19.1203) (210 0.0 0.0 1.0)))
Просмотров: 2415
 
Непрочитано 06.12.2016, 19:35
#2
valerik88


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


Наверное не стоит писать <Имя объекта: 7eeaa808> строкой. Используй переменную в которой это имя хранится..
valerik88 вне форума  
 
Автор темы   Непрочитано 06.12.2016, 20:04
#3
oleg_marshinov


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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Наверное не стоит писать <Имя объекта: 7eeaa808> строкой. Используй переменную в которой это имя хранится..
С переменными проблем нет, но все таки может вручную или однозначно нет?
oleg_marshinov вне форума  
 
Непрочитано 06.12.2016, 23:29
#4
Кулик Алексей aka kpblc
Moderator

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


И не сработает. Некоторые группы надо исключать (навскидку: -1, 5, 330). Почитай DXF Reference - там расписано, какие группы за что отвечают.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.12.2016, 23:17
1 | #5
prajdziswet


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


у тебя количество скобок в примере не то (после имени объекта, что с -1)...
Некоторые имена (что с -1 или 330) ты вручную точно не задашь(у меня не получалось), как и говорит в принципе Кулик Алексей - только не исключать =>а, заноси в переменные и создавай свой список (без имени -1 у тебя автокад не будет знать, что модернизировать и т.д)
Так в принципе через assoc у тебя почти вручную, и не забывай как ты создаешь список list или cons (лучше последней, если заменяешь, она создает точечную пару, если например (8 . "0")). Если все правильно то должно пройти...

п.с я вот недавно сам не заметя добавлял, пары в сплайн и автокад его проглатывал = как и в норме, entmod возвращал список, но потом этот сплайн не хотел даже передвигаться по имени..
и вродебы если у тебя список не содержит какие то важные пары (например слоя 8, если ты забыл и исключил) автокад сам добавит, или я уже с другой командой путаю...

Последний раз редактировалось prajdziswet, 20.12.2016 в 23:22.
prajdziswet вне форума  
 
Непрочитано 21.12.2016, 00:16
#6
prajdziswet


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


например зная имя собираю другой список и меня. бррр, на kzkz и автокад добавляет все остальное

Нажмите на изображение для увеличения
Название: 10bcf-clip-20kb.png
Просмотров: 43
Размер:	45.8 Кб
ID:	181182

пролестай изображение вправо, чтобы увидеть что было
prajdziswet вне форума  
 
Непрочитано 23.12.2016, 14:49
#7
Do$

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


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
вродебы если у тебя список не содержит какие то важные пары (например слоя 8, если ты забыл и исключил) автокад сам добавит, или я уже с другой командой путаю...
Наверное, имеется в виду ENTMAKE
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 24.12.2016, 19:48
#8
prajdziswet


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Наверное, имеется в виду ENTMAKE
точно , хотя и пример показал что и entmod копирует что было (я задавал поменять только текст, а оно скопировало все остальное)
prajdziswet вне форума  
 
Автор темы   Непрочитано 31.12.2016, 01:55
#9
oleg_marshinov


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


нет я имел в виду именно entmod

----- добавлено через ~10 мин. -----
вот мой код в нем тоже все прекрасно
работает
Код:
[Выделить все]
 ;======================================================================

(vl-load-com)
(defun C:bl1 (/

	      
                  NABOR                ;Набор примитивов
                  i                    ;Счётчик
                  ENT_i                ;i-й примитив из набора NABOR
                  LEN_all              ;Суммарная длина примитивов
                  text_i                ;контекст итого текста
                )


   (princ "\nВыберите примитивы: ")

  ;--------------------------------------------------------------------
  ;Выбор примитивов [выбираем нужные, отфильтровываем ненужные]
  ;--------------------------------------------------------------------
  (setq NABOR (ssget '((0 . "insert"))
		     );end ssget
  );end setq


  (if NABOR

     ;=================================================================
     ;Если в "сети" попались нужные примитивы
     ;=================================================================
     (progn
       ;---------------------------------------------------------------
       ;Сообщение о количестве выбранных примитивов
       ;---------------------------------------------------------------
       (princ (strcat "\nВсего выбрано примитивов: " (itoa (sslength NABOR))))
       (princ "\n-------------------------")

       ;---------------------------------------------------------------
       ;Установка начальных значений
       ;---------------------------------------------------------------
       (setq i 0)
       
    
      (print '(пример ввода ("1000766" "Kc-1" "10001000" "Kc-2")))
       (setq str1 (getstring "Введите"))
       

       
       (setq spisok1 (read str1))
       (print spisok1) ; отладка ввода
;;;       (setq spisok1 '("bbbb" "dd"))

       ;---------------------------------------------------------------
       ;Цикл по набору NABOR
       ;---------------------------------------------------------------
       (while (and
                NABOR
                (< i (sslength NABOR))
              )

         ;.............................................................
         ;Определяем Имя i-го примитива из набора NABOR
         ;.............................................................
         (setq ENT_i (ssname NABOR i))

         ;.............................................................
         ;Определяем text i-го примитива из набора NABOR
         ;.............................................................
        
(print (entget ent_i))
(setq ENT1_i (entnext ent_i)) ; получение аттрибута НЕВИДИМЫЙ
(print (entget ent1_i)) ; проверка значения


(setq ENT2_i (entnext ent1_i)) ; получение аттрибута2 МАРКА
(print (entget ent2_i)) ; проверка значения
	 
	 (setq text_i (assoc 1 (entget ENT1_i))) ; получение (1. ****) из атрибута1 НЕВИД
	 (print text_i)

(setq spi2_i (member (cdr text_i) spisok1)) ; проверка имени в списке

(print spi2_i); имя в списке
	 
 (if spi2_i (entmod (subst (cons 1 (CADR spi2_i)) (assoc 1 (entget ENT2_i)) (entget  ent2_i))))



	 
	 
  (setq i (1+ i))
 
       );end while
 


    
 ); end prong

     ;=================================================================
     ;Если подходящие примитивы отобраны не были
     ;=================================================================
     (progn
       (princ "\nПримитивы не выбраны.")
       (princ "\nВыход...")
     );end progn ELSE
  );end if


  (prin1)
);end defun
;***************************************
но я задал конкретный вопрос, не прикладной
чисто из теории мне интересно почему не работает???

----- добавлено через ~13 мин. -----
не работает в смысле введением списка
если не может вообще- то почему?
если может то конкретный пример ввода списком (только скобки и цифры как в entmake)

----- добавлено через ~24 мин. -----
Код:
[Выделить все]
((-1 . <Имя объекта: 7f69d005be0>) (0 . "LINE") (330 . <Имя объекта: 7f69d0039f0>) (5 . "236") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 1) (100 . "AcDbLine") (10 1114.29 1584.05 0.0) (11 1514.42 1314.88 0.0) (210 0.0 0.0 1.0))
Команда: ENTmod Неизвестная команда "ENTMOD".  Для вызова справки нажмите F1.
Команда: (ENTmod((-1 . <Имя объекта: 7f69d005be0>)(62 . 2)))
; ошибка: излишние cdrs в точесной паре на входе
----- добавлено через ~35 мин. -----
Код:
[Выделить все]
Команда: (ENTmod((-1 . 7f69d005be0)(62 . 2)))
; ошибка: неверный тип аргумента: consp 2

Последний раз редактировалось Кулик Алексей aka kpblc, 31.12.2016 в 11:15.
oleg_marshinov вне форума  
 
Непрочитано 06.01.2017, 09:23
#10
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Проверить не могу, но предполагаю, что может сработать (entmod (list (cons -1 <Имя объекта....
По опыту - такая конструкция иногда выручала в фильтрах ssget.
skkkk вне форума  
 
Непрочитано 12.01.2017, 13:14
#11
prajdziswet


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


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
Некоторые имена (что с -1 или 330) ты вручную точно не задашь(у меня не получалось),
простейши пример
Код:
[Выделить все]
 
;выводит dxf последнего объекта 
(entget (entlast))
;или так
(entget <имя объекта-можешь скопировать>)
;-выдаст оошибку во втором случае
читай выше там и пример на entmod ...
у меня не такой сложный пример (на обновление текста) , состоящий из имени и нового текста (все остальное задавать не обязательно)
во вторых помоему '(1 . "новый текст") и (cons 1 "новый текст") не совсем равно воспринимает (как точечную пару), хотя зрительно это одно и тоже...
попробуй в моем примере вместо (cons 1 "новый текст") на '(1 . "новый текст"), но имя как я через переменную брал

п.с и пробуй обновлять не сразу все как ты пишешь а только один параметр (как у меня в примере)....потому что
Цитата:
Сообщение от prajdziswet Посмотреть сообщение
Некоторые имена (что с -1 или 330) ты вручную точно не задашь(у меня не получалось)....,
попробуй как я написал, просто когда ты всё засовываешь(конечно так можно), есть больше вероятность что ты натлкнешься на то что вручную неполучается задать "типа имени"

Последний раз редактировалось prajdziswet, 12.01.2017 в 13:21.
prajdziswet вне форума  
 
Непрочитано 12.01.2017, 13:42
#12
Кулик Алексей aka kpblc
Moderator

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


prajdziswet, почитай про функцию quote и ее краткую форму записи - '
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2017, 18:47
#13
prajdziswet


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


Алексей я знаю, что такое " ' ", просто таким образом у меня как то не получалось изменить через entmod (может банально ошибку совершил, уже не помню)...

ладно возращаемся к нашему вопросу
покажу на примере примере = простого текста:
Нажмите на изображение для увеличения
Название: 1.png
Просмотров: 26
Размер:	48.7 Кб
ID:	182003

Нажмите на изображение для увеличения
Название: 2.png
Просмотров: 20
Размер:	59.1 Кб
ID:	182004

Нажмите на изображение для увеличения
Название: 3.png
Просмотров: 21
Размер:	68.5 Кб
ID:	182005

п.с в последнем случае имел введу изменить не "имя", а объект с копированым именем
что впринципе было также показано и выше ....
просто некоторые dxf нельзя просто скопировать например -1, 330 и т.д... А почему? это к разработчикам автокада

п.с простым копированием нельзя а например car, nth 0 ... можно вычленить и оперировать тем же именем...

Последний раз редактировалось prajdziswet, 12.01.2017 в 19:00.
prajdziswet вне форума  
 
Непрочитано 12.01.2017, 19:01
#14
prajdziswet


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


Нажмите на изображение для увеличения
Название: 4.png
Просмотров: 14
Размер:	42.7 Кб
ID:	182006

для интереса можешь попробывать изменить содержимое многострочного текста (я имеею введу параметр dxf 1), вроде все аналогично - а вот нет текст исчезает...ну короче попробуй сам увидишь....

п.с можно только догадываться, например в англиской версии автокада у тебя же не по руски будет писать "<имя объекта..",то есть это просто вывод на экран этого имени==а объект может быть одним и темже...
только разработчики автокада тебе ответят на твой вопрос "почему"

Последний раз редактировалось prajdziswet, 12.01.2017 в 19:16.
prajdziswet вне форума  
 
Непрочитано 12.01.2017, 19:46
#15
Кулик Алексей aka kpblc
Moderator

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


prajdziswet, почитай, что в какой группе хранится (http://help.autodesk.com/view/ACD/20...3-7E60B22BB5BD или http://images.autodesk.com/adsk/file...erence_enu.pdf ).
И теперь найди несколько отличий от своего кода:
Код:
[Выделить все]
 _$ (setq ent (car (entsel "\nMTEXT : ")))
<Entity name: 7ffffb064c0>
_$ (setq lst (entget ent))
((-1 . <Entity name: 7ffffb064c0>) (0 . "MTEXT") (330 . <Entity name: 7ffffb051f0>) (5 . "25C") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbMText") (10 1032.94 2118.74 0.0) (40 . 2.5) (41 . 0.0) (46 . 0.0) (71 . 1) (72 . 5) (1 . "Multi line text - string 1\\PMulti line text - string 2") (7 . "Standard") (210 0.0 0.0 1.0) (11 1.0 0.0 0.0) (42 . 34.4935) (43 . 7.42212) (50 . 0.0) (73 . 1) (44 . 1.0))
_$ (cdr (assoc 1 lst))
"Multi line text - string 1\\PMulti line text - string 2"
_$ (subst (cons 1 "New string1\\PNew string 2\\PNew string 3") (assoc 1 lst) lst)
((-1 . <Entity name: 7ffffb064c0>) (0 . "MTEXT") (330 . <Entity name: 7ffffb051f0>) (5 . "25C") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbMText") (10 1032.94 2118.74 0.0) (40 . 2.5) (41 . 0.0) (46 . 0.0) (71 . 1) (72 . 5) (1 . "New string1\\PNew string 2\\PNew string 3") (7 . "Standard") (210 0.0 0.0 1.0) (11 1.0 0.0 0.0) (42 . 34.4935) (43 . 7.42212) (50 . 0.0) (73 . 1) (44 . 1.0))
_$ (entmod (subst (cons 1 "New string1\\PNew string 2\\PNew string 3") (assoc 1 lst) lst))
((-1 . <Entity name: 7ffffb064c0>) (0 . "MTEXT") (330 . <Entity name: 7ffffb051f0>) (5 . "25C") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbMText") (10 1032.94 2118.74 0.0) (40 . 2.5) (41 . 0.0) (46 . 0.0) (71 . 1) (72 . 5) (1 . "New string1\\PNew string 2\\PNew string 3") (7 . "Standard") (210 0.0 0.0 1.0) (11 1.0 0.0 0.0) (42 . 34.4935) (43 . 7.42212) (50 . 0.0) (73 . 1) (44 . 1.0))
P.S. Вообще говоря, для модификации примитива через ename-представления у меня уже оочень давно существует свой вариант:
Код:
[Выделить все]
 (defun _kpblc-ent-modify-autoregen (ent bit value ent_regen / ent_list old_dxf new_dxf layer_dxf70)
                                   ;|
*    Функция модификации указанного бита примитива
*    Параметры вызова:
  entity     примитив, полученный через (entsel), (entlast) etc
  bit        dxf-код, значение которого надо установить
  value      новое значение
  ent_regen  выполнять или нет регенерацию примитива сразу. t/ nil
*    Примеры вызова:
(_kpblc-ent-modify-autoregen (entlast) 8 "0" t)  ; перенести последний примитив на слой 0
(_kpblc-ent-modify-autoregen (entsel) 62 10 nil)  ; установить выбранному примитиву цвет 10
*    Возвращаемое значение:
*  примитив с модифицированным dxf-списком. Примитив перерисовывается в
* зависимости от значения ключа ext_regen
|;
  (if (not (and (or (= (strcase (cdr (assoc 0 (entget ent))) nil) "STYLE")
                    (= (strcase (cdr (assoc 0 (entget ent))) nil) "DIMSTYLE")
                    (= (strcase (cdr (assoc 0 (entget ent))) nil) "LAYER")
                    ) ;_ end of or 
                (= bit 100)
                ) ;_ end of and 
           ) ;_ end of not 
    (progn (setq ent_list (entget ent)
                 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 
           (if (not (equal new_dxf (setq old_dxf (assoc bit ent_list))))
             (progn (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
                      (progn (entupd ent) (redraw ent))
                      ) ;_ end of if
                    ) ;_ end of progn 
             ) ;_ end of if 
           ) ;_ end of progn 
    ) ;_ end of if 
  ent
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.01.2017, 21:46
#16
prajdziswet


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
http://images.autodesk.com/adsk/file...erence_enu.pdf
=понравилась вот эта ссылка, спасибо
prajdziswet вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Entmod может работать на прямую со списком введенным вручную?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
REVIT 2017. Revit Extensions Не армирует колонны любого сечения, и также вручную, в чем может быть проблема? erikbond Revit 4 16.12.2016 10:21
Отчего в расчетной схеме колонна может работать неправильно? Helter_Skelter Лира / Лира-САПР 4 22.06.2012 12:00
Работать с таким объектом или нет? И сколько может стоить? -Илья- Технология и организация строительства 8 11.03.2012 22:10
Может ли стиральная машина работать от подвешиваемой к потолку канистры с водой? Сергей Караваев Водоснабжение и водоотведение 138 04.02.2012 21:20
Подскажите пожалуйста может ли инженер-конструктор(машиностроение) работать проектировщиком (металлоконструкции ) в строительстве? oleg konstruktor Организация проектирования и оформление документации 29 03.12.2011 21:42