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

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

OFFSET через Autolisp

Ответ
Поиск в этой теме
Непрочитано 02.01.2020, 21:31 #1
OFFSET через Autolisp
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
Просмотров: 1376
 
Непрочитано 03.01.2020, 02:35
#2
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 204


Если площадь новой полилинии меньше старой, тогда её стереть и отофсетить в другую сторону.
nikе вне форума  
 
Непрочитано 03.01.2020, 12:49
#3
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Есть опция офсетить в две стороны и меньшую по площади удалять.
Sleekka вне форума  
 
Автор темы   Непрочитано 03.01.2020, 14:17
#4
Avs801


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


Цитата:
Сообщение от nikе Посмотреть сообщение
Если площадь новой полилинии меньше старой, тогда её стереть и отофсетить в другую сторону.
Хорошая мысль.
Если не сложно, подскажите как считать площадь новой полилинии. Я немного подзабыл. Давно не программировал.

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Sleekka Посмотреть сообщение
Есть опция офсетить в две стороны и меньшую по площади удалять.
Если не сложно, подскажите что за функция? Она стандартная?
Avs801 вне форума  
 
Непрочитано 03.01.2020, 14:46
#5
nikе

конструктор Лего
 
Регистрация: 21.10.2005
Краснодар
Сообщений: 204


Посмотреть методы и свойства, которые поддерживает объект:
(vlax-dump-object (vlax-ename->vla-object(car(entsel)))t)

Конкретно площадь последнего созданного объекта:
(vla-get-Area (vlax-ename->vla-object(entlast)))
nikе вне форума  
 
Непрочитано 03.01.2020, 21:07
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Как-то так. Пробуй. Обрабатывается вариант "промаха" при использовании entsel. Выход - по клавише enter
Код:
[Выделить все]
 
(defun c:offsetout (/ Flg offset ent vobj offsetObj1 offsetObj2)
(vl-load-com)
  (initget 6)
  (while (setq offset (getreal "\nInput offset distance <exit> :"))
    (setq Flg t)
    (while Flg
      (setq ent (entsel "\nSelect an object <exit> :"))
      (cond
        ((null ent)
         (if (= (getvar "ERRNO") 52)
           (setq Flg nil)
           (princ " *missing*")
         ) ;_ end of if
        )
        (t
         (setq ent  (car ent)
               vobj (vlax-ename->vla-object ent)
         ) ;_ end of setq
         (setq offsetObj1
                (car (vlax-safearray->list
                       (vlax-variant-value
                         (vla-offset vobj (* -1 offset))
                       ) ;_ end of vlax-variant-value
                     ) ;_ end of vlax-safearray->list
                ) ;_ end of car
         ) ;_ end of setq
         (setq offsetObj2
                (car
                  (vlax-safearray->list
                    (vlax-variant-value (vla-offset vobj offset))
                  ) ;_ end of vlax-safearray->list
                ) ;_ end of car
         ) ;_ end of setq
         (if (> (vla-get-area offsetObj1) (vla-get-area offsetObj2))
           (vla-erase offsetObj2)
           (vla-erase offsetObj1)
         ) ;_ end of if
        )
      ) ;_ end of cond
    ) ;_ end of while
    (initget 6)
  ) ;_ end of while
  (princ)
) ;_ end of defun

----- добавлено через ~9 мин. -----
Второй вариант. с проверкой как вычерчена полилиния, по часовой или против
Функция lib:pline_clockwise взята отсюда (команда PL-CW)

Код:
[Выделить все]
 
(defun c:offsetout2 (/ Flg offset ent vobj)
  (initget 6)
  (while (setq offset (getreal "\nInput offset distance <exit> :"))
    (setq Flg t)
    (while Flg
      (setq ent (entsel "\nSelect an object <exit> :"))
      (cond
        ((null ent)
         (if (= (getvar "ERRNO") 52)
           (setq Flg nil)
           (princ " *missing*")
         ) ;_ end of if
        )
        (t
         (setq ent  (car ent)
               vobj (vlax-ename->vla-object ent)
         ) ;_ end of setq
         (if (lib:pline_clockwise vobj)
           (vla-offset vobj (* -1 offset))
           (vla-offset vobj offset)
           )
        )
      ) ;_ end of cond
    ) ;_ end of while
    (initget 6)
  ) ;_ end of while
  (princ)
) ;_ end of defun
(defun lib:pline_clockwise ( lw  / LST MAXP MINP)
(if (= (type lw) 'ENAME)
    (setq lw (vlax-ename->vla-object lw)))  
(vla-GetBoundingBox lw 'MinP 'MaxP)
(setq
minp(vlax-safearray->list minp)
MaxP(vlax-safearray->list MaxP)
lst(mapcar(function(lambda(x)
(vlax-curve-getParamAtPoint lw
(vlax-curve-getClosestPointTo lw x))))
(list minp(list(car minp)(cadr MaxP))
MaxP(list(car MaxP)(cadr minp)))))
(if(or
(<=(car lst)(cadr lst)(caddr lst)(cadddr lst))
(<=(cadr lst)(caddr lst)(cadddr lst)(car lst))
(<=(caddr lst)(cadddr lst)(car lst)(cadr lst))
(<=(cadddr lst)(car lst)(cadr lst)(caddr lst))) t nil))
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 03.01.2020 в 21:19.
VVA вне форума  
 
Автор темы   Непрочитано 03.01.2020, 22:02
#7
Avs801


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


Огромное всем спасибо! Получилось.
Avs801 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > OFFSET через Autolisp

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эвакуация из категории А через категорию В проект 1234 Пожарная безопасность 1 02.06.2017 18:01
Эвакуация из подвала через окно, через соседнее помещение Route Прочее. Архитектура и строительство 7 24.03.2017 16:18
Построение фигуры через AutoLISP severnet LISP 42 20.05.2015 09:40
Как сделать что бы открывать и сохранять файлы можно было как обычно через мышку, а не через командную строку? beslan AutoCAD 1 17.10.2011 11:43
Через 25 лет стоимость эксплуатации превышает стоимость строительства ? Tyhig Архитектура 41 24.08.2011 11:00