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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Не могли бы вы объяснить некоторые неясности в тексте программы

Не могли бы вы объяснить некоторые неясности в тексте программы

Ответ
Поиск в этой теме
Непрочитано 04.03.2014, 14:15 #1
Не могли бы вы объяснить некоторые неясности в тексте программы
bengan777
 
Регистрация: 10.07.2012
Сообщений: 35

Скачал с этого (по моему) сайта лисп файл.
Текст:

Код:
[Выделить все]
  ;;;---------Программа замены указанным блоком выбираемых с сохранением исходных атрибутов и параметров вставки ---------------------------------------------------------
(defun c:blrevers (/ a b)
;;; замена выбранных блоков на указанный
  (and (setq a (car (entsel "\nВыберите исходный блок: ")))
       (setq a (entget a))
       (while (and (= (cdr (assoc 0 a)) "INSERT")
                   (setq b (car (entsel "\nВыберите изменяемый блок: ")))
                   (setq b (entget b))
                   (= (cdr (assoc 0 b)) "INSERT")
                   (entmod (vl-remove (assoc 330 b) (subst (assoc 2 a) (assoc 2 b) b)) ;_ vl-remove
                   ) ;_ entmod
              ) ;_ and
       ) ;_ while
  ) ;_ and
  (princ)
) ;_ defun
Вообщем то всё понятно, непонимаю только зачем тут нужна команда vl-remove. Как я понял она в данном случае убирает из списка блока имя сущности, т.е. подобную строку (330 . <Имя объекта: 72b41cf8>).
Зачем это нужно?
Просмотров: 2880
 
Непрочитано 04.03.2014, 17:20
#2
Do$

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


Интересный метод замены... В списке меняем имя, entmod, и блок становится другим. Первый раз такое вижу Работает?
Наверное, только при удалении владельца из этого списка, AutoCAD проглатывает такую подмену. Уберите эту vl-remove, попробуйте, будет работать или нет.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 04.03.2014, 17:46
#3
bengan777


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


Работает :-), Уберал vl-remove, без нее не работает.
Вот и не могу никак понять почему.
По идее мы присваиваем переменной a список исходного блока, далее переменной b список изменяемого блока
А далее (subst (assoc 2 a) (assoc 2 b) b) заменяем в новом списке имя блока на имя из старого (т.е. меняем 1н блок на другой).
По идее должно работать, но не работает :-(
А вот когда мы удаляем имя сущности из обновлённого списка b (vl-remove (assoc 330 b) b) то начинает работать...
Почему, никак не пойму :-(

----- добавлено через ~11 мин. -----
Самое интересное что аналогичная процедура в другом коде работает

Код:
[Выделить все]
 ;;;---------Программа замены указанным блоком выбираемых с сохранением угла поворота
(defun c:replaceblockal (/ old_list new_block old_angle counter myset)
 (princ "n\Выберите исходный блок")
  (if (setq old_list (car (entsel)));Выделить объект
    (progn
      (setq old_block (assoc 2 (entget old_list)))
      (setq old_angle (assoc 50 (entget old_list)))
      (princ "n\Выберите заменяемые блоки")
       (if (setq myset (ssget))
	(progn 
	  (setq counter 0)
	  (while (< counter (sslength myset))
	    (setq new_list (entget (ssname myset counter)))
	    (setq new_block (assoc 2 new_list))
	    (setq new_angle (assoc 50 new_list))
	    (entmod (subst old_angle new_angle (subst old_block new_block new_list)))
	    (setq counter (+ counter 1))
	   );Конец While
	);Конец Progn
	(princ "\nВы не выделили ни одного объекта")
      );Конец If
    );Конец Progn
    (princ "\nВы не выделили исходный объект")
  );Конец If
  (princ)
);_ Defun

Последний раз редактировалось bengan777, 04.03.2014 в 18:36.
bengan777 вне форума  
 
Непрочитано 04.03.2014, 20:53
#4
WhiteShark


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


Работает с побочными эффектами. Потом редактор атрибутов не пашет как надо с этим новым блоком
WhiteShark вне форума  
 
Непрочитано 04.03.2014, 20:59
#5
Кулик Алексей aka kpblc
Moderator

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


Выполни _.attsync
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.03.2014, 09:33
#6
bengan777


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


Цитата:
Уберал vl-remove, без нее не работает.
Блин, видимо ошибся где то, работает и без vl-remove.
Не подскажете всётаки зачем эту команду вставили в код?
bengan777 вне форума  
 
Непрочитано 05.03.2014, 10:14
#7
Дима_

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


Если она загруженна 1 раз из любого лиспа в этом сеансе - будет работать. По умолчанию правильно писать во все "отдельнолежащие" файлы.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 05.03.2014, 10:17
1 | #8
Do$

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


Ну одно дело заменить угол поворота блока (код из #3) и совсем другое - сменить определение блока. Наверное, работает без vl-remove, если у блоков одинаковые атрибуты, просто немного отличаются по внутренним примитивам. Неизвестно еще, как будет такое работать с динамическими блоками... В общем, я бы такое не стал использовать. Кодов по замене блоков на форуме полно - можно найти более предсказуемый и понятный.
Цитата:
Сообщение от bengan777 Посмотреть сообщение
А вот когда мы удаляем имя сущности из обновлённого списка b (vl-remove (assoc 330 b) b)
Это не имя сущности, это ссылка на владельца ВХОЖДЕНИЯ блока - ОПИСАНИЕ блока модели или листа или другого блока.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 05.03.2014, 11:03
#9
bengan777


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


(330 . <Имя объекта: 7e0c5cf8>)
да действительно, имя сущности идёт с dxf кодом (-1 . <Имя объекта: 7e0e11c0>)
330 Метка мягкого указателя преобразуется командой вставить и ссылка.
Теперь более или менее понятно.
bengan777 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Не могли бы вы объяснить некоторые неясности в тексте программы



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Расчётные программы (каталог, сравнение, отзывы) swell{d} Расчетные программы 266 24.06.2015 19:40