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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как выполнить нескольких операций над одним объектом (переменной)?

Как выполнить нескольких операций над одним объектом (переменной)?

Ответ
Поиск в этой теме
Непрочитано 10.01.2018, 21:51 #1
Как выполнить нескольких операций над одним объектом (переменной)?
Тимиргалин Салават
 
Регистрация: 18.12.2012
Сообщений: 19

Хочу написать программу для объединения нескольких пересекающихся контуров (замкнутых полилиний) в один. Пишу следущее:

(setq p1 (entsel "Выберите перый контур"))
(setq p2 (entsel "Выберите второй контур"))
(command "_region" p1 "")
(command "_region" p2 "")
(command "_union" p1 p2 "")

Но команда region уже изменяет объект и команда union не работает на этих переменных. Как ее заставить работать?

P.S. Можно ли такое сделать для неограниченного числа изначальных контуров?
Просмотров: 1697
 
Непрочитано 10.01.2018, 22:16
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Ну даже если забыть про возможные проблемы с command, никто не мешает использовать (entlast).

----- добавлено через 54 сек. -----
Offtop: Хоть убей не понимаю, почему бы не использовать объектную модель... Или все пишется для MacOS?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 10.01.2018, 23:46
#3
Тимиргалин Салават


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


Спасибо больше за совет - помогло.
Но в дальнейшем возникла следующая проблема - так как получившийся объединенный region нужно преобразовать обратно в polyline, то я попробовал сделать это через hatch и hatchgenerateboundary. Однако entlast не возвращает мне результат команды hatch в переменную p4, не могу понять почему так происходит. Вот код:

(setq p1 (entsel "Выберите перый контур"))
(setq p2 (entsel "Выберите второй контур"))
(command "_region" p1 "")
(setq p1 (entlast))
(command "_region" p2 "")
(setq p2 (entlast))
(command "_union" p1 p2 "")
(setq p3 (entlast))
(command "_hatch" "s" p3 "")
(setq p4 (entlast))
(command "_erase" p3 "")
(command "_hatchgenerateboundary" p4)
(command "_erase" p4 "")
Тимиргалин Салават вне форума  
 
Непрочитано 11.01.2018, 07:02
2 | #4
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Простейшая программа для решения задачи:
Код:
[Выделить все]
;;; Обединение 2-х пересекающихся замкнутых полилиний в одну замкнутую полилинию.
(defun C:JPL ( / p1 p2 p3)
(setq p1 (entsel "Выберите первый контур"))
(if p1 (setq p2 (entsel "\nВыберите второй контур")) (princ "\nНе выбраны контуры."))
(if p2
    (progn
    (command "_region" p1 "")
    (setq p1 (entlast))
    (command "_region" p2 "")
    (setq p2 (entlast))
    (command "_union" p1 p2 "")
    (setq p3 (entlast))
    (command "_EXPLODE" p3)
    (command "_PEDIT" "_m" "_p" "" "_y" "_j" "" "_c" "")
    ) ; progn
    (princ "\nНе выбраны контуры.")
) ; if
(princ)
)
P.S.
Название темы надо изменить.
Setvar вне форума  
 
Автор темы   Непрочитано 12.01.2018, 01:12
#5
Тимиргалин Салават


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


Спасибо за доработку программы. Она уже приносит пользу в области экологии.

Еще бы хотелось разобраться для чего в ней используется:

1. progn

2. princ в последней строке
Тимиргалин Салават вне форума  
 
Непрочитано 12.01.2018, 05:24
1 | #6
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


См. Справочник по стандартным функциям AUTOLISP:
http://aco.ifmo.ru/~nadinet/html/oth...book/lisp.html
Для более полного понимания функции (princ) надо посмотреть описание функции (prin1).
Setvar вне форума  
 
Непрочитано 12.01.2018, 05:43
2 | #7
vladimirr_b


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


1. progn - используется для выполнения нескольких выражений там, где допускается выполнение только одного выражения. Т.е. для выполнения нескольких операций в функции if .
2. princ - сообщение о, том что не выбраны контуры.
Таким образом в Вашу программу добавляется проверка выбора контуров командой entsel:
Код:
[Выделить все]
 (if (выбран контур?)   ; условие
  (выполнить выражение) ; в случае если контур выбран. Здесь допускается выполнение одного выражения, поэтому применяется функция Progn, которая воспринимается функцией if как одно выражение
  (сообщение о том, что контуры не выбраны) ; в случае если контур не выбран
)
[/i]

Последний раз редактировалось vladimirr_b, 12.01.2018 в 07:49.
vladimirr_b вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как выполнить нескольких операций над одним объектом (переменной)?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Монолитная ж.б. плита перекрытия жилого этажа с консольными вылетами по периметру на высоте более 40 м. Возможно ли выполнить? Julianna Железобетонные конструкции 45 02.10.2016 11:27
Как выполнить расчет на аварийную ситуацию для маяка, рекламного щита, флагштока? ФАХВЕРК Конструкции зданий и сооружений 10 13.01.2016 16:08
Как правильно выполнить перекрытие с большими пролетами и неправильной формы RustamM Железобетонные конструкции 4 15.07.2015 15:33
Корректировка атрибутов блоков в нескольких чертежах AutoCAD из Excel superkot007 Программирование 14 20.10.2011 12:53
Можно ли выполнить криволинейную железобетонную стену прямолинейными участками? Василий А. Технология и организация строительства 1 28.06.2011 09:37