Хочу стереть примитивы в определённой области с помощью Лисп. Что не так делаю?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Хочу стереть примитивы в определённой области с помощью Лисп. Что не так делаю?

Хочу стереть примитивы в определённой области с помощью Лисп. Что не так делаю?

Ответ
Поиск в этой теме
Непрочитано 26.09.2013, 19:05 #1
Хочу стереть примитивы в определённой области с помощью Лисп. Что не так делаю?
НеВа64
 
Регистрация: 21.11.2009
Сообщений: 14

Вот кусочек кода
Код:
[Выделить все]
 (setq ppR1 (list 180 190))
(setq ppR2 (list -60 -30))
(command "_erase" ppR1 ppR2)
(command)
Вопщем этот кусочек кода ничего не выпиливает в пространстве между точками ppR1 и ppR2
Просмотров: 3074
 
Непрочитано 26.09.2013, 19:09
#2
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


функция ожидает PICKSET, а получает LIST. Это не так
gomer вне форума  
 
Автор темы   Непрочитано 26.09.2013, 20:42
#3
НеВа64


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


Ну я не в курсе таких нюансов.
Команда Line, например, вполне удовлетворена точкой, заданной списком list
а как этот PICKSET вкрячить в код?

Т.е. надо сначала выделить объекты, а потом их как-то передать команде erase?
Тогда два вопроса:
1. Как выделить объекты, заключённые в секущей рамке между точками ppR1 и ppR2?
2. Как этот набор передать команде erase?

Вы уж простите за дилетанские вопросы.
Спасибо

Последний раз редактировалось НеВа64, 26.09.2013 в 20:50.
НеВа64 вне форума  
 
Непрочитано 26.09.2013, 21:25
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


НеВа64, тебе разве самому не интересно узнать как? гугл в помощь.
gomer вне форума  
 
Автор темы   Непрочитано 26.09.2013, 21:32
#5
НеВа64


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


да уже всё это время гуглю и листаю талмуд Полещука
Самое смешное, что 20 лет назад, ещё в 10-м автокаде я всё это прекрасно знал и умел. Потом был огромный перерыв, в связи со сменой работы и других крутых перемен в жизни.
А щас стал стар и туп. Кое-что вспомнил сам. Достал запылившиеся англоязычные пособия (тогда только такие были), прикупил новые и грызу, помогая своим детям студентам. Грызу именно потому, что стало интересно вновь. Но тяжеловато возращаться в ту же реку. Течение быстрое, многое упущено.

тыкс
добрался до ssget

ну вот
Код:
[Выделить все]
 (ssget "_С" ppR1 ppR2)
Консоль пишет:
; ошибка: слишком мало аргументов
_$

Последний раз редактировалось НеВа64, 26.09.2013 в 21:55.
НеВа64 вне форума  
 
Непрочитано 26.09.2013, 22:05
#6
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


а что такое "_С" ?
gomer вне форума  
 
Автор темы   Непрочитано 26.09.2013, 22:34
#7
НеВа64


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


"_С" это режим или метод выбора примитивов. В данном случае это значит секущей рамкой.
Можно и так "С", но Полещук говорит, что надо с нижним подчёркиваем
Я вот взял тупо из Полещука готовую строку:
Код:
[Выделить все]
 (ssget "_С" '(14.3 -5.2) '(27.6 106.1))
а оно мне в ответ:
; ошибка: слишком мало аргументов


Поиграл с буквой "С", меняя с русского на латинский
Цитата:
<Selection set: 1a4>
Надо думать, что выбор примитивов состоялся?

теперь это надо передать команде erase
Код:
[Выделить все]
 (setq ppR1 (list 180 190))
(setq ppR2 (list -60 -30))
(setq nabor (ssget "_C" ppR1 ppR2))
(command "erase" nabor)
И шо мы видим?
Вот что:
Цитата:
(180 190)
(-60 -30)
<Selection set: 1a8>
; ошибка: Функция отменена
Памагиииите!!!

Последний раз редактировалось НеВа64, 26.09.2013 в 22:52.
НеВа64 вне форума  
 
Непрочитано 26.09.2013, 23:23
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от НеВа64 Посмотреть сообщение
Памагиииите!!
А я eсли ручками удалять, что будет? Объясните почему у вас не работало и вдруг заработало это (ssget "_C" ppR1 ppR2)?
gomer вне форума  
 
Непрочитано 26.09.2013, 23:42
1 | #9
maratovich


 
Регистрация: 12.07.2009
г. Самара
Сообщений: 2,437
Отправить сообщение для maratovich с помощью Skype™


Может пригодится.
Честно скопированный лисп (где уже не помню) и немного допиленный под себя.
Много мусора, но работает.
Запускать командой Lastik

Код:
[Выделить все]
 (defun c:Lastik () 
(defun c:scb () (section t nil)); Стереть снаружи оставить рамку
(defun c:sc () (section nil nil)); Стереть снаружи убрать рамку
(defun c:vnutri () (section nil t)); Стереть внутри



* * * * * ERROR ROUTINE * * * * *
(defun newerr (msg)
 (prompt (strcat "\nSection cancelled: " msg)); PRINT ERROR
 (setvar "cmdecho" cmd); RESET COMMAND ECHO
 (setvar "highlight" hlt); RESET HIGHLIGHT
)


* * * * * MAIN FUNCTION * * * * *
(defun section (bdr n / olderr newerr cmd hlt p1 p2 p1x p1y p2x p2y p3 p4 dst plus minus p1a p2a p3a p4a lst)
 

(while;;;;;;;;;;;;;;;;Начать повтор команды
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Для Отключение привязок
   ;;Запоминаем текущие состояния режимов ORTO, SNAP, OSNAP, ANGBASE
  (setq old_ortho (getvar "ORTHOMODE")
	old_snap (getvar "SNAPMODE")
	old_osnap (getvar "OSMODE")
	old_autosnap (getvar "AUTOSNAP")
	old_angbase (getvar "ANGBASE")
	) ;_end of setq
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;




(graphscr); CHANGE TO GRAPHICS SCREEN
 (setq olderr *error* ; SET UP NEW
       *error* newerr ; ERROR ROUTINE
       cmd (getvar "cmdecho"); SAVE COMMAND ECHO SETTING
       hlt (getvar "highlight"); SAVE HIGHLIGHT SETTING
       p1 (getpoint "\nУкажите начальную точку стирания: "); GET LL CORNER OF RECTANGLE
       p2 (getcorner p1 "\nУкажите конечную точку стирания: "); GET UR CORNER
       p1x (car p1)
       p1y (cadr p1)
       p2x (car p2)
       p2y (cadr p2)
       p3 (list p2x p1y); BUILD LR CORNER
       p4 (list p1x p2y); BUILD UL CORNER
       dst (/ (distance p1 p2) 1000.0); OFFSET FACTOR FOR TRIMMING
       plus (if n - +)
       minus (if n + -)
 );END SETQ

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Отключаем привязки
      ;;Подавляем эхо
      (setvar "CMDECHO" 0)
      ;;Обнуляем режимы ORTO, SNAP, OSNAP
      (setvar "ORTHOMODE" 0)
      (setvar "SNAPMODE" 0)
      (setvar "OSMODE" 0)
      (setvar "AUTOSNAP" 0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


 (cond
  ((and (< p1x p2x) (< p1y p2y)); P1 IS LL CORNER
   (setq p1a (list (minus p1x dst) (minus p1y dst)); BUILD LL TRIM LINE POINT
         p2a (list (plus p2x dst) (plus p2y dst))); BUILD UR TRIM LINE POINT
  )
  ((and (> p1x p2x) (< p1y p2y)); P1 IS UL CORNER
   (setq p1a (list (plus p1x dst) (minus p1y dst)); BUILD LL TRIM LINE POINT
         p2a (list (minus p2x dst) (plus p2y dst))); BUILD UR TRIM LINE POINT
  )
  ((and (> p1x p2x) (> p1y p2y)); P1 IS UR CORNER
   (setq p1a (list (plus p1x dst) (plus p1y dst)); BUILD LL TRIM LINE POINT
         p2a (list (minus p2x dst) (minus p2y dst))); BUILD UR TRIM LINE POINT
  )
  ((and (< p1x p2x) (> p1y p2y)); P1 IS LR CORNER
   (setq p1a (list (minus p1x dst) (plus p1y dst)); BUILD LL TRIM LINE POINT
         p2a (list (plus p2x dst) (minus p2y dst))); BUILD UR TRIM LINE POINT
  )
 ); END COND
 (setq p3a (list (car p2a) (cadr p1a)); BUILD LR TRIM LINE POINT
       p4a (list (car p1a) (cadr p2a)); BUILD UL TRIM LINE POINT
 ); END SETQ
 (setvar "cmdecho" 0); TURN OFF COMMAND ECHO
 (setvar "highlight" 0); TURN OFF HIGHLIGHT
 (command "_.pline" p1 p3 p2 p4 "_c"); DRAW POLYLINE BORDER
 (setq lst (entlast)); SAVE POLYLINE ENTITY NAME
 (if n                                          ;ERASE ENTITIES
  (command "_.erase" "_w" p1 p2 "_r" lst "")    ;INSIDE RECTANGLE
  (command "_.erase" "_all" "_r" "_c" p1 p2 "") ;OUTSIDE RECTANGLE
 ); END IF
 (command "_.trim" lst "" "_f" p1a p3a ""     ;TRIM ENTITIES AROUND BORDER
                          "_f" p3a p2a ""     ;DO TO THE FINICKY NATURE OF TRIMMING
                          "_f" p2a p4a ""     ;WITH THE FENCE OPTION, I HAVE USED FOUR
                          "_f" p4a p1a "" ""  ;FENCE LINES INSTEAD OF ONE LONG ONE
 ); END COMMAND
 (if (not bdr) (entdel lst)); DELETE POLYLINE BORDER IF DESIRED
 (setq *error* olderr); RESTORE ORIGINAL ERROR ROUTINE
 (setvar "highlight" hlt); RESTORE HIGHLIGHT
 (setvar "cmdecho" cmd); RESTORE COMMAND ECHO

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;Восстанавливаем привязки
      ;;Восстанавливаем состояния режимов ORTO, SNAP, OSNAP, ANGBASE
      (setvar "ORTHOMODE" old_ortho)
      (setvar "SNAPMODE" old_snap)
      (setvar "OSMODE" old_osnap)
      (setvar "AUTOSNAP" old_autosnap)
      (setvar "ANGBASE" old_angbase)
      ;;Включаем эхо
      (setvar "CMDECHO" 1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


 (princ); EXIT CLEANLY

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
);_ end of while;;;;;;;;;;;;Конец повтора команды
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

)

(princ)
)
)(c:Lastik)
;;__________________________________________________________________
Только с отменой команд поаккуратнее......
maratovich вне форума  
 
Автор темы   Непрочитано 27.09.2013, 10:16
#10
НеВа64


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


Цитата:
Сообщение от gomer Посмотреть сообщение
А я eсли ручками удалять, что будет?
Собственно так я и делал. Но надоело. Поясню.
У меня два студента с механизмами по ТММ. Положение механизмов меняется. Прежде чем нарисовать новое положение, надо удалить старое. Операция элементарно простая, но уже маленько утомила. Казалось бы, проще в начале кода поставить блок удаления старого механизма и фсьо. Оказалось, что это не так просто для начинающего.


Цитата:
Сообщение от gomer Посмотреть сообщение
Объясните почему у вас не работало и вдруг заработало это (ssget "_C" ppR1 ppR2)?
Я уже выше пояснил. Всё дело в раскладке клавиатуры. У меня Автокад 2009 РУС.
Сначала я набрал латиницей "С", оно выдало ошибку режима, тогда набрал "С" кирилицей, выдало ошибку "мало аргументов". Набрал "_С" кирилицей - мало аргументов. Тупо перенабрал код Полещука используя опять кирилицу "_С". Ну а потом таки набрал латиницей "_С". И оно заработало.

maratovich, спасибо большое.
Всё оказывается очень просто. В моём начальном коде "не так" было две вещи:
1. "_С" должно быть набрано латиницей
2. Erase должна закрываться пробелом.
Работающий код:
Код:
[Выделить все]
 (setq ppR1 (list 180 190))
(setq ppR2 (list -60 -30))
(command "_.erase" "_c" ppR1 ppR2 "")
Вывод: Erase, как команда Автокада, нуждающаяся в получении точки, ожидает именно list. Просто нужно правильно записать команду синтаксически.

Последний раз редактировалось НеВа64, 27.09.2013 в 10:38.
НеВа64 вне форума  
 
Непрочитано 27.09.2013, 10:57
#11
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от НеВа64 Посмотреть сообщение
Собственно так я и делал. Но надоело.
нет, вы меня не поняли. посмотрите как работает выбор объектов команды erase, да и других то же. и поймете чего вам не хватает.
зы, ничего удалять не нужно, можно изменять. И еще, параметрические зависимости... не?
gomer вне форума  
 
Автор темы   Непрочитано 27.09.2013, 11:33
#12
НеВа64


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


Цитата:
Сообщение от gomer Посмотреть сообщение
зы, ничего удалять не нужно, можно изменять.
Если вы про мой механизм, то проще удалить и нарисовать по новой.

Цитата:
Сообщение от gomer Посмотреть сообщение
И еще, параметрические зависимости... не?
Опять же, если вы за мой механизм, то да - зависимость параметрическая. Только всё очень просто, т.к. параметр всего один меняется. Угловое положение ведущего звена.
НеВа64 вне форума  
 
Непрочитано 27.09.2013, 12:08
#13
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от НеВа64 Посмотреть сообщение
Если вы про мой механизм, то проще удалить и нарисовать по новой.
да, не проще ли просто повернуть один отрезок, параметрика перерисует полностью все остальное?
gomer вне форума  
 
Непрочитано 27.09.2013, 12:15
#14
Do$

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


Кстати, да, поддержу gomer'а. С помощью параметризации очень удобно делать кинематические схемы. Как по лекциям: наложил на объекты нужные ограничения - и механизм готов. Для схем в расчетках по ТММ самое то!
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 27.09.2013, 13:59
#15
НеВа64


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


Я готов с вами согласитья друзья, но я не владею этой технологией.
Для меня оказалось проще аналитически определить зависимости координат необходимых точек от параметра и напечатать эти зависимости на языке ЛИСПа.
Тем более, что эта аналитика потом всё равно нужна при определении скоростей и ускорений и при отрисовке этих векторов как на самом механизме, так и отдельно в виде планов скоростей и ускорений.
НеВа64 вне форума  
 
Непрочитано 27.09.2013, 14:33
#16
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Есть графический метод, есть аналитический, во втором случае задача решается элементарно в маткаде без построений вообще.
В чем проблема? так попробуйте изучить. возможно оно того стоит
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Хочу стереть примитивы в определённой области с помощью Лисп. Что не так делаю?