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

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

LISP для offset

Ответ
Поиск в этой теме
Непрочитано 16.02.2010, 15:18 #1
LISP для offset
Positron
 
Регистрация: 25.06.2009
Сообщений: 147

Здраствуйте. Пишу такой лисп(макросом):
^C^C(setq s1 (ssget))(setq w1 (getdist))(set p1 (getpoint))(command "_offset" w1 s1 p1)
работает всё кроме стороны для offset "p1", для нё использую точку (set p1 (getpoint))...

Почему не работает? , может там не точку нада, хотя просит точку при ручном вводе:

Command: _offset
Current settings: Erase source=No Layer=Source OFFSETGAPTYPE=0
Specify offset distance or [Through/Erase/Layer] <2.5>: Specify second point:
Select object to offset or [Exit/Undo] <Exit>:
Specify point on side to offset or [Exit/Multiple/Undo] <Exit>:
Просмотров: 9525
 
Непрочитано 16.02.2010, 15:31
#2
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Слушай, твой макрос не дает никакого выигрыша по сравнению со стандартной командой "_offset" ("подобие"). Как и в команде, тебе надо указать расстояние, выбрать объект и указать направление, куда делать подобие. Может, ты думал, что сможешь сделать подобие сразу для нескольких объектов? Фигу.
Profan вне форума  
 
Непрочитано 16.02.2010, 15:48
#3
Буджум

мелкий местный хищник
 
Регистрация: 20.10.2009
замкадье
Сообщений: 72


А зачем тебе (set p1...) понадобился?
(setq p1 ...) тебе в помощь
Буджум вне форума  
 
Непрочитано 16.02.2010, 15:53
#4
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Команда: _select
Выберите объекты: найдено: 1
Выберите объекты: найдено: 1, всего: 2
Выберите объекты:
Команда:
Команда:
Команда: _offset
Величина смещения или [Точка] <13.1047>:
Выберите объект для создания подобных или <выход>: _P

*Неверный выбор*
Требуется один объект.
Выберите объект для создания подобных или <выход>:
Profan вне форума  
 
Непрочитано 16.02.2010, 16:54
#5
Do$

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


А если вместо (ssget) вставить (car (entsel "\nУкажите линию:"))?
Do$ вне форума  
 
Автор темы   Непрочитано 16.02.2010, 17:00
#6
Positron


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


на данный момент достиг сего (экспериментально), в 2-х макросах, но работает:
^C^C(setq sel1 (ssget))(setq we1 (getdist))(setq poi1 (getpoint))
^C^C(command "_offset" we1 sel1 poi1);^C(command "_offset" (+ 1 we1) sel1 poi1)

Хочу зделать так, чтобы в итоге лисп запоминал N количество длин и
1ой кнопкой (лисп или макрос) отбивал контуры разных объектов с этим N длинами...

например: я в ручную указал длину (мишкой) 2 и 5, потом указал круг и оно отбило круг с +2 и +5
потом указал прямоугольник, квадрат и т.п.


тоисть штоб лисп:
1. Запоминал "набор" (определённое количество длинн, указаных мишкой)
2. Запоминал сторону если ето возможно, если нет, тогда штоб 1-н раз указывать сторону, для каждого объекта при использовании готового "набора" длин.
3. Автоматически отбивал весь "набор" длин для указанного объекта.

Прозьба к програмистам LISP, помоч в создании сего лиспа.
я язык лисп по книжке щас пробую, но опыта у меня 0...

Последний раз редактировалось Positron, 16.02.2010 в 18:24. Причина: Внёс конструктивность в цель лиспа, после слов "тоисть штоб лисп:" и прозьбу к програмистам 17:24
Positron вне форума  
 
Непрочитано 16.02.2010, 18:34
#7
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


так што ли
Код:
[Выделить все]
(defun c:sof ( / snp nameset setlength off pnt  
                 i pl_run pl_new sp_new ly_p )

(setq snp (getvar "Osmode"))
(setvar "Osmode" 0) 
(if(not (tblsearch "layer"  "off"))
(entmake(list '(0 . "LAYER" )'(100 . "AcDbSymbolTableRecord")
              '(100 . "AcDbLayerTableRecord")'(70 . 0)'( 2 . "off")'(62 . 7))))
(setq nameset (ssget "_:L" '(( 0 . "LWPOLYLINE,LINE"))))
(setq setlength (sslength nameset)) ;dlina nabora
(setq off (getreal "Offset?"))
(setq pnt (getpoint "Point of offset?"))
(setq i -1)
(repeat setlength
   (setq i (1+ i))
   (setq pl_run (ssname nameset i))
   (command "_.offset" off pl_run pnt "")
   (setq pl_new (entlast))
   (setq sp_new  (entget pl_new))
   (setq ly_p (assoc 8 sp_new)) 
   (setq sp_new  (subst '(8 . "off") ly_p sp_new))
   (entmod  sp_new)
   (entupd  (cdr (assoc -1  sp_new)))
)
(setvar "Osmode" snp) 
)

Последний раз редактировалось Victor, 16.02.2010 в 18:41.
Victor вне форума  
 
Автор темы   Непрочитано 16.02.2010, 19:20
#8
Positron


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


Пример(во вложении) -

У нас есть:
"начальная" линия,от неё отходят линии с отступами 3, 8, 9
1. Надо мишкой отбить растояние (например мы незнаем што они отступают 3, 8, 9), лисп запоминает каждую длинну "набор" длин.
2. Указываем стонорону (например + и - ставить, - лево, +право от линии)
3. Выбераем контур (Красной линиией обозначен)
4. Лисп спрашывает сторону (типа + или -), выбераем например -, дальше лисп отбивает готовый "набор" длин.
Миниатюры
Нажмите на изображение для увеличения
Название: 1-Model.jpg
Просмотров: 270
Размер:	64.6 Кб
ID:	33701  
Вложения
Тип файла: dwg
DWG 2007
1.dwg (123.6 Кб, 2064 просмотров)
Positron вне форума  
 
Непрочитано 17.02.2010, 09:43
1 | #9
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


значит ничего не понял
Тут выбирем линию офсета потом её офсеты, потом полилинию которую офсетим и точку куда офсетим.
Код:
[Выделить все]
(defun c:nof ( / name_p1 p1 nameset  off pnt  
                 setlength i pl_run p_run sp_d)
(vl-load-com) 
(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq p1 (vlax-curve-getPointAtParam name_p1 0))
(princ "\nPolyline offset?")
(setq nameset (ssget "_:L" '(( 0 . "LWPOLYLINE"))))
(setq setlength (sslength nameset)) ;dlina nabora
(setq i -1 sp_d nil)
(repeat setlength
  (setq i (1+ i))
  (setq pl_run (ssname nameset i))
  (setq p_run(vlax-curve-getPointAtParam pl_run 0))
  (setq off (distance p1 p_run))
  (setq sp_d (append sp_d (list off)))
)

(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq pnt (getpoint "\nPoint of offset?"))
(setq i -1)
(repeat setlength
   (setq i (1+ i))
   (setq pl_run (ssname nameset i))
   (command "_.offset" (nth i sp_d) name_p1 pnt "")
)
)
Victor вне форума  
 
Автор темы   Непрочитано 17.02.2010, 12:27
#10
Positron


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


Цитата:
Сообщение от Victor Посмотреть сообщение
значит ничего не понял
Тут выбирем линию офсета потом её офсеты, потом полилинию которую офсетим и точку куда офсетим.
Код:
[Выделить все]
(defun c:nof ( / name_p1 p1 nameset  off pnt  
                 setlength i pl_run p_run sp_d)
(vl-load-com) 
(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq p1 (vlax-curve-getPointAtParam name_p1 0))
(princ "\nPolyline offset?")
(setq nameset (ssget "_:L" '(( 0 . "LWPOLYLINE"))))
(setq setlength (sslength nameset)) ;dlina nabora
(setq i -1 sp_d nil)
(repeat setlength
  (setq i (1+ i))
  (setq pl_run (ssname nameset i))
  (setq p_run(vlax-curve-getPointAtParam pl_run 0))
  (setq off (distance p1 p_run))
  (setq sp_d (append sp_d (list off)))
)

(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq pnt (getpoint "\nPoint of offset?"))
(setq i -1)
(repeat setlength
   (setq i (1+ i))
   (setq pl_run (ssname nameset i))
   (command "_.offset" (nth i sp_d) name_p1 pnt "")
)
)
Спасибо, то что надо!
А возможно ли, чтобы "набор" длин можно было записывать в базу, типа название - "набор длин"

Напимер в такой последовательности:
1. Лисп спрашует - Добавить в базу контуры или извлеч
а)добавить - тоисть "Тут выбирем линию офсета потом её офсеты",
после лисп спрашивает "Введите имя", вводим имя.(по умолчанию стоит "извлеч")
(если имя существует, лисп об етом уведомляет и просит поменять имя т.как ...)
б)извлеч - лисп выдаёт меню с названиями "наборами" длин,
выбераем длину из списка.
(но по умолчанию после выбора извлеч уже выбрано предедущее название, если в етом чертеже небыло выбрано тогда спрашивает название из имеющегося списка, если таковой есть)

2.Либа извлечённый, либо только что добавленный "набор" длин используем
как и ранёе - "потом полилинию которую офсетим и точку куда офсетим."

И конечно чтоб база сохранялась при открытии в новом чертеже.

Последний раз редактировалось Positron, 17.02.2010 в 12:47. Причина: Разукрасил текст(11:38), добавил по умолчанию после "извлеч"(11:47)
Positron вне форума  
 
Непрочитано 17.02.2010, 13:03
#11
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Автор темы   Непрочитано 17.02.2010, 17:55
#12
Positron


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



столкнулся с проблемой, неотбивается полилиния как надо,
что я делаю не так?

Во вложнии пример.
Вложения
Тип файла: dwg
DWG 2007
сложная полилиния.dwg (111.0 Кб, 2134 просмотров)
Positron вне форума  
 
Непрочитано 18.02.2010, 18:40
1 | #13
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Я исходил из ошибочного предположения что у вас настоящие офсеты и искал расстояния между началами линий. А у вас как попало и куда попало.
Попробуйте вот эту. Кстати, что это за частокол?
Код:
[Выделить все]
(defun c:nof ( / name_p1 p1 nameset  off pnt  
                 setlength i pl_run p_run sp_d)
(vl-load-com) 
(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq p1 (vlax-curve-getPointAtParam name_p1 0))
(princ "\nPolyline offset?")
(setq nameset (ssget "_:L" '(( 0 . "LWPOLYLINE"))))
(setq setlength (sslength nameset)) ;dlina nabora
(setq i -1 sp_d nil)
(repeat setlength
  (setq i (1+ i))
  (setq pl_run (ssname nameset i))
  (setq p_run(vlax-curve-getClosestPointToProjection pl_run p1 '(0 0 1)))
  (setq off (distance p1 p_run))
  (setq sp_d (append sp_d (list off)))
)

(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq pnt (getpoint "\nPoint of offset?"))
(setq i -1)
(repeat setlength
   (setq i (1+ i))
   (setq pl_run (ssname nameset i))
   (command "_.offset" (nth i sp_d) name_p1 pnt "")
)
)
Victor вне форума  
 
Автор темы   Непрочитано 19.02.2010, 11:56
#14
Positron


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


Цитата:
Сообщение от Victor Посмотреть сообщение
Кстати, что это за частокол?
Частокол зделал, потому что иначе неполучалось, лисп отступы неправильно давал... он, берёт растаяние крайних точок, как я понял.

Это отступы для направления(траетория) движения фрез ЧПУ... их много изза фрезы, так как криволинейный профиль невозможно зделать идеально на обычном фрейзерном станке.
(Это профиль штапика из дуба)
В старину делали резчики, а щас ЧПУ существенно помогает.
Штапики бывают разных форм, поетому универсальный лисп очень бы помог, просто бывают и намного больше этих линий, в ручную это отнимает уйму времени...


Проверил лисп, работает супер, спасибо!

Последний раз редактировалось Positron, 19.02.2010 в 12:15. Причина: Спасибо
Positron вне форума  
 
Непрочитано 19.02.2010, 12:06
#15
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,825
<phrase 1=


Цитата:
Сообщение от Disney Посмотреть сообщение
нужен!!! давай!!!
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon на форуме  
 
Непрочитано 19.02.2010, 18:21
#16
Victor


 
Регистрация: 14.06.2009
Бат-Ям
Сообщений: 295


Первый раз делаю такое, гарантий никаких. Тут (W)rite/(S)how/(O)ffset/(E)nd: W-записать, выбираем первую линию и офсеты, и даём название варианту. S - показать какие варианты есть в рисунке, надеюсь названия разные. O - выбираем линию, точку и пишем название варианта. Если нет варианта-Variant not faund! E - выход. Вариант присоединяется к линии от которой делаем офсет . Стираем линию - нет варианта. Копируем в другой файл - появляется вариант. Запуск mof
Код:
[Выделить все]
 (defun wright_of ( / name_p1 p1 nameset setlength i pl_run p_run 
                     off sp_d name_v Le edata Le2) 
(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq p1 (reverse(cdr(reverse(vlax-curve-getPointAtParam name_p1 0)))))
(princ "\nPolyline offset?")
(setq nameset (ssget "_:L" '(( 0 . "LWPOLYLINE"))))
(setq setlength (sslength nameset)) ;dlina nabora
(setq i -1 sp_d nil)
(repeat setlength
  (setq i (1+ i))
  (setq pl_run (ssname nameset i))
  (setq p_run(vlax-curve-getClosestPointToProjection pl_run p1 '(0 0 1)))
  (setq off (cons 1040 (distance p1 p_run)))
  (setq sp_d (append sp_d (list off)))
)
(setq name_v (getstring "\nName of variant: "))
(regapp "L1")
(setq Le (entget name_p1))
(setq edata (list(list -3 (append(list "L1" (cons 1000 name_v)) sp_d))))
(setq Le2 (append Le edata))
(entmod Le2)
)


(defun Show_of ( / nameset setlength i pl_run sp_run xd_run v_run v_str) 
(setq nameset (ssget "_X" '(( 0 . "LWPOLYLINE")(-3 ("*")))))     
(if (/= nil nameset)
    (progn
    (setq setlength (sslength nameset) i -1 v_str "")  
    (repeat setlength
      (setq i (1+ i))
      (setq pl_run (ssname nameset i))
      (setq sp_run (entget pl_run '("L1")))
      (setq xd_run (assoc -3 sp_run))  
      (setq xd_run (cdr(car(cdr xd_run))))
      (setq v_run (cdr(car xd_run)))
      (setq v_str (strcat v_str " " v_run)) 
     ) ;repeat
    (princ "Variants: ")
    (princ v_str)
    ) ;progn
(princ "No variants\n")
)
)


(defun Offset_of ( / name_p1 pnt name_v nameset setlength  
                     i pl_run sp_run xd_run v_run sp_d ) 
(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq pnt (getpoint "\nPoint of offset?"))
(setq name_v (getstring "\nName of variant? "))
(setq nameset (ssget "_X" '(( 0 . "LWPOLYLINE")(-3 ("*")))))     
(setq setlength (sslength nameset) i -1 v_str "" sp_d nil) 
(repeat setlength
  (setq i (1+ i))
  (setq pl_run (ssname nameset i))
  (setq sp_run (entget pl_run '("L1")))
  (setq xd_run (assoc -3 sp_run))  
  (setq xd_run (cdr(car(cdr xd_run))))
  (setq v_run (cdr(car xd_run)))
  (if (= name_v v_run)
      (foreach n xd_run(if(= 1040 (car n))(setq sp_d(append sp_d(list(cdr n))))))
  )
)
(setq setlength (length sp_d))
(princ "setlength=")
(princ setlength)
(if(/= setlength 0)
   (progn
   (setq i -1)
   (repeat setlength
     (setq i (1+ i))
     (setq pl_run (ssname nameset i))
     (command "_.offset" (nth i sp_d) name_p1 pnt "")
   ) ;repeat
   ) ;progn
   (princ "\nVariant not faund!")
) ;if
)

(defun c:mof ( / key )
(vl-load-com)
(setq key "S")
(while(or(= key "W")(= key "O")(= key "S"))
   (initget 1 "W S O E")
   (setq key (getkword "\n(W)rite/(S)how/(O)ffset/(E)nd: "))
   (if(or(= key "W")(= key "w"))(wright_of))
   (if(or(= key "S")(= key "s"))(Show_of))
   (if(or(= key "O")(= key "o"))(Offset_of))
) ;while
) ;defun

Последний раз редактировалось Victor, 19.02.2010 в 18:29.
Victor вне форума  
 
Непрочитано 20.02.2010, 10:56
#17
Jоhnny

всё что связано с упорядоченным движением заряженных частиц
 
Регистрация: 27.07.2007
М.О.
Сообщений: 1,693


Цитата:
Сообщение от Positron Посмотреть сообщение
столкнулся с проблемой, неотбивается полилиния как надо,
что я делаю не так?
Что конкретно не оффсетится? Я попробовал несколько полилиний, у меня всё норм, порядок действий такой:
Цитата:
Command: _offset
Current settings: Erase source=No Layer=Source OFFSETGAPTYPE=0
Specify offset distance or [Through/Erase/Layer] <3.8>: Specify second point:
Select object to offset or [Exit/Undo] <Exit>:
Specify point on side to offset or [Exit/Multiple/Undo] <Exit>:
Jоhnny вне форума  
 
Непрочитано 20.02.2010, 13:25
#18
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от zenon Посмотреть сообщение
нужен!!! давай!!!
Dynamic Offset
Эта программа позволяет выполнять динамическое подобие нескольких объектов одновременно, с произвольным числом подобий и дополнительным коэффициентом расстояния подобия.

После выбора объектов, пользователь может ввести расстояние подобия в командную строку, или указать на экране мышкой, а так же воспользоваться следующими опциями:

Число подобий: число подобий может быть увеличено/уменьшено, используя клавиши +/-, или альтернативно пользователь может ввести количество подобий, нажав 'N'.
Коэффициент подобия: коэффициент расстояния между последовательными подобиями может быть изменен, нажав 'F'.
Настройки подобия: Значение Слой/Тип линии/Вес линии и Цвет могут быть изменено, нажав 'S'.
Способ подобия: Может быть изменен, нажатием 'Tab', пользователь может выбрать подобие в одну сторону или обе стороны одновременно.
Удаление Объекта: пользователь может сохранить/удалить исходный объекты, для выбора нажимаем 'D'.
Подобие к центру: пользователь может выполнить подобие к центру двух объектов, нажимая 'C'.
Подсветка подобия: нажатием Shift, пользователь может подсветить объекты подобия(необходим Express Tools).
(перевёл как мог, сильно не бейте)

Copyright © Lee McDonnell, October 2009. All Rights Reserved.
Вложения
Тип файла: zip DynOff V2-1.zip (15.3 Кб, 243 просмотров)
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 21.02.2010 в 20:13.
Disney вне форума  
 
Автор темы   Непрочитано 23.02.2010, 11:46
#19
Positron


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


Цитата:
Сообщение от Victor Посмотреть сообщение
Первый раз делаю такое, гарантий никаких. Тут (W)rite/(S)how/(O)ffset/(E)nd: W-записать, выбираем первую линию и офсеты, и даём название варианту. S - показать какие варианты есть в рисунке, надеюсь названия разные. O - выбираем линию, точку и пишем название варианта. Если нет варианта-Variant not faund! E - выход. Вариант присоединяется к линии от которой делаем офсет . Стираем линию - нет варианта. Копируем в другой файл - появляется вариант. Запуск mof

(defun wright_of ( / name_p1 p1 nameset setlength i pl_run p_run
off sp_d name_v Le edata Le2)
(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq p1 (reverse(cdr(reverse(vlax-curve-getPointAtParam name_p1 0)))))
(princ "\nPolyline offset?")
(setq nameset (ssget "_:L" '(( 0 . "LWPOLYLINE"))))
(setq setlength (sslength nameset)) ;dlina nabora
(setq i -1 sp_d nil)
(repeat setlength
(setq i (1+ i))
(setq pl_run (ssname nameset i))
(setq p_run(vlax-curve-getClosestPointToProjection pl_run p1 '(0 0 1)))
(setq off (cons 1040 (distance p1 p_run)))
(setq sp_d (append sp_d (list off)))
)
(setq name_v (getstring "\nName of variant: "))
(regapp "L1")
(setq Le (entget name_p1))
(setq edata (list(list -3 (append(list "L1" (cons 1000 name_v)) sp_d))))
(setq Le2 (append Le edata))
(entmod Le2)
)


(defun Show_of ( / nameset setlength i pl_run sp_run xd_run v_run v_str)
(setq nameset (ssget "_X" '(( 0 . "LWPOLYLINE")(-3 ("*")))))
(if (/= nil nameset)
(progn
(setq setlength (sslength nameset) i -1 v_str "")
(repeat setlength
(setq i (1+ i))
(setq pl_run (ssname nameset i))
(setq sp_run (entget pl_run '("L1")))
(setq xd_run (assoc -3 sp_run))
(setq xd_run (cdr(car(cdr xd_run))))
(setq v_run (cdr(car xd_run)))
(setq v_str (strcat v_str " " v_run))
) ;repeat
(princ "Variants: ")
(princ v_str)
) ;progn
(princ "No variants\n")
)
)


(defun Offset_of ( / name_p1 pnt name_v nameset setlength
i pl_run sp_run xd_run v_run sp_d )
(setq name_p1 (car(entsel "\nFirst poliline?")))
(setq pnt (getpoint "\nPoint of offset?"))
(setq name_v (getstring "\nName of variant? "))
(setq nameset (ssget "_X" '(( 0 . "LWPOLYLINE")(-3 ("*")))))
(setq setlength (sslength nameset) i -1 v_str "" sp_d nil)
(repeat setlength
(setq i (1+ i))
(setq pl_run (ssname nameset i))
(setq sp_run (entget pl_run '("L1")))
(setq xd_run (assoc -3 sp_run))
(setq xd_run (cdr(car(cdr xd_run))))
(setq v_run (cdr(car xd_run)))
(if (= name_v v_run)
(foreach n xd_run(if(= 1040 (car n))(setq sp_d(append sp_d(list(cdr n))))))
)
)
(setq setlength (length sp_d))
(princ "setlength=")
(princ setlength)
(if(/= setlength 0)
(progn
(setq i -1)
(repeat setlength
(setq i (1+ i))
(setq pl_run (ssname nameset i))
(command "_.offset" (nth i sp_d) name_p1 pnt "")
) ;repeat
) ;progn
(princ "\nVariant not faund!")
) ;if
)

(defun c:mof ( / key )
(vl-load-com)
(setq key "S")
(while(or(= key "W")(= key "O")(= key "S"))
(initget 1 "W S O E")
(setq key (getkword "\n(W)rite/(S)how/(O)ffset/(E)nd: "))
(if(or(= key "W")(= key "w"))(wright_of))
(if(or(= key "S")(= key "s"))(Show_of))
(if(or(= key "O")(= key "o"))(Offset_of))
) ;while
) ;defun
Работает хорошо.
Эсть просьбы по улучшению лиспа:
1. Возможно ли зделать отдельный файлик, куда будут кидатся все записанные ("первую линию и офсеты") названия офсетов (их линии из файлов при создании) по типу команды -_wblock или иначе...

Например эсли -_wblock то можно так:
а) на каждый "оффсет" создаётся свой dwg файл и именуется такимже названием
или
б) создаётся 1 файлик и в него записуются линии, с отступом.
__________________________________________________________
Адрес папки куда записывать файлы dwg указать в самом лиспе чтоб незбивалось, или как иначе, единственное чтоб 1-н раз, а потом об этом невспоминать до переноса на другой ПК напимер.
__________________________________________________________

к примеру делал Krieger в этой теме http://forum.dwg.ru/showthread.php?t=44503
а вот код :
(defun Kr_Wblock (/ ss n key pr filename)
(vl-load-com)
(setq ss (ssget) n 0 key t cmd (getvar "cmdecho"))
(while (and (ssname ss n) key (setq pr (entget (ssname ss n))) )
(if (and (eq (cdr (assoc 0 pr)) "TEXT")
(eq (strcase (cdr (assoc 8 pr))) "NAME_FRAGMENT"))
(setq key nil
filename (strcat (vla-get-path (vla-get-activedocument (vlax-get-acad-object))) "\\" (cdr (assoc 1 pr))))
)
(setq n (1+ n))
);while
(if filename
(progn

(setq lstpt (apply 'append (mapcar '(lambda (obj / minpt maxpt)
(vla-getboundingbox obj 'minpt 'maxpt)
(mapcar 'vlax-safearray->list (list minpt maxpt))
);end of lambda
(mapcar 'vlax-ename->vla-object
(vl-remove-if '(lambda (a) (wcmatch (cdr (assoc 0 (entget a))) "MTEXT,DIMENSION,*TABLE")) (sstolist ss)))
))
);end of setq

(vl-file-delete (strcat filename ".dwg"))
(vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))
(setvar "cmdecho" 0)
(vl-cmdf "_ucs" "_m" (list (apply 'min (mapcar 'car lstpt)) (apply 'min (mapcar 'cadr lstpt))))
(vl-cmdf "_-wblock" filename "" "0,0,0" ss "")
(vl-cmdf "_oops")
(vl-cmdf "_ucs" "_p")
(setvar "cmdecho" cmd)
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))
);progn
(princ "\nНе найдена метка")
);if
(princ)
);defun

;---------------------------------------

(defun sstolist (ss / i lst); конвертирует набор в список
(setq i 0)
(if ss
(repeat (sslength ss)
(setq lst (append lst (list (ssname ss i))) i (1+ i))
));end of repeat & if
lst
);end of sstolist


2. Возможно ли зделать чтоб список вылетал как при нажатии на правую кнопку мыши, чтоб не вводить каждый раз на клавиатуре?
Positron вне форума  
 
Непрочитано 02.01.2020, 21:04 Offset замкнутой полилинии через Autolisp
#20
Avs801


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


Добрый день.
Задача следующая:
Есть замкнутая полилиния. Необходимо сделать OFFSET наружу на заданную величину.
На данный момент написал такой код, но он не правильно работает если исходная полилиния нарисована против часовой стрелки (при этом оффсет происходит внутрь).
Прошу вашей помощи, уважаемые форумчане.

Код:
[Выделить все]
 (defun c:offsetout (/)
 
   (while t
   (setq offset (getreal "\nInput offset distance :"))

   (while (not(setq ent_point (entsel "\nSelect an object or press ESC :"))))
   (setq ent (nth 0 ent_point))
   (setq vla_obj (vlax-ename->vla-object ent))
   (setq offsetObj1 (vla-Offset vla_obj (* -1 offset)))
    ;(setq offsetObj2 (vla-Offset vla_obj (* 1 offset)))
   (setq vla_obj1 (vlax-ename->vla-object (car(offsetObj1))))
    ;  (vlax-dump-object vla_obj1)
   

  ); end while
); end defun
Avs801 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP для offset

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Бетоны для гидротехнических сооружений Egor_II Железобетонные конструкции 9 03.02.2016 11:06
бетонирование в зимних условиях тен Технология и организация строительства 107 21.12.2013 13:59
LISP для поиска групп (наборов) одинаковых примитивов и замена их блоком ElectroBOG LISP 20 23.07.2010 16:00
Юмор 2007 Огурец Разное 1172 29.12.2007 11:16