Тема: команда offset

где-то видел прогр., с помощью кот. командой offset рисуются параллельные линии одновременно в обе стороны от исходной,
теперь нужна, кто знает где ее искать

Re: команда offset

Сунулся, гдето только что видал!!
Хрясь и часа полтора по Инету шарил!!
Благо выделенка и халява :))
Нашел, но не то что встречал, смотри может подойдет:
http://www.autokad.ru/zip/dof.zip

Re: команда offset

работеает как то непонятно..то  две линии нарисует, то одну...иногда исходную не удаляет

Re: команда offset

Для отрисовки нескольких параллельных линий относительно исходной можете воспользоваться инструментом Multyline

Re: команда offset

> Vladimir
Функция отрисовывается корректно, если указать направление отступа внутрь об'екта (если он имеет некоторуй радиус искривления) если указать внешнюю сторону,то отступ отрисовываеться только в одну сторону, с сохранением исходной линии, дуги или об'единеной полилинии.
У меня есть код функции отрисовывающий Offset в обе стороны с выделением группы об'ектов, но она работает по заданным в коде слоям и оставляет исходящий набор не удаляя его

Re: команда offset

Рисование параллельных линий не так просто, как кажется. Это была первая программа, которую я когда-то делал. С тех пор написал множество вариантов.  Тут множество нюансов, связанных с особенностями формирования вторичных примитивов по OFFSET


MultiLine хороша, но это совсем другое.

Вот пример одного варианта низкоуровневой функции, использующейся при рисовании двойных

(defun ic_MkTrassLstFromAxes (Os       LastPnt    LastAng     Width    DelOs    LineWidth     /      LST1     LSTVER    LSTVER1     LSTVER2       NEWLINE  TL    TP   )
   ;; Параметры
   ;;Os         - осевая линия (примитив)
   ;;LastPnt    - последняя точка осевой
   ;;LastAng    - угол последнего сегмента осевой
   ;;Width      - полуширина трассы от осевой
   ;;DelOs      - T - стирать осевую
   ;; возвращает список координат новой плинии

   (setq LstVer NIL)
   (setq tp (polar LastPnt (pravo LastAng) Width))
   (setq tl (polar LastPnt (levo LastAng) Width))
   (command "_.OFFSET"
       Width
       (list Os LastPnt)
       tp
       ""
   ) ;_ end of command
   (if (setq Lst1 (ic_GetPolyList (entlast)))
     (setq LstVer1 (car Lst1))
   ) ;_ end of if
   (command "_.ERASE" (entlast) "")
   (command "_.OFFSET"
       Width
       (list os LastPnt)
       tl
       ""
   ) ;_ end of command

   (if (setq Lst1 (ic_GetPolyList (entlast)))
     (setq LstVer2 (car Lst1))
   ) ;_ end of if
   (command "_.ERASE" (entlast) "")

   (if DelOs
     (command "_.ERASE" Os "")
   ) ;_ end of if
   (setq lstver (append lstver1 (reverse lstver2)))
   (setq NewLine (ic_MakeNewPoly LstVer T NIL LineWidth))
   Lstver
) ;_ end of defun


Хороший пример был в Акад-11-12(DLINE). Здоровенная программа, от которой потом отказались.

Re: команда offset

;;;   Разработано инженером с АвтоВАЗа в 1999году
;;;
;;;   Функция выполняет Offset в обе стороны от
;;;   выбранных примитивов с сохранением исходного контура
;;;
;;;   Функция поддерживает типы примитивов:   
;;;            "LWPOLYLINE"
;;;            "LINE"
;;;            "ARC"
;;;   Код облегчен для дальнейшей адаптации
;;;   07.05.2002.
;;;   Pacman
;;;

(defun c:off_set ( / off pl li arc filter_me due_n dis i j e a p1 p2)
   
   (setq off (getvar "OSMODE"))(setvar "OSMODE" 0)
   
   (setq pl (cons 0 "LWPOLYLINE")
    li (cons 0 "LINE")
    arc (cons 0 "ARC")
    )
       ;;;фильтр выбора типов приметивов
   (setq filter_me (list (cons -4 "")
            );_list
    )
   (setq due_n (ssget  filter_me))
   (setq dis (getreal "\nВведите расстояние между раздвоенными линиями: ")
    dis (/ dis 2.)
    )
   (setq i (sslength due_n)
    j 0)
   
   (while (< j i)
     (setq a (ssname due_n j)
      j (1+ j)
      e (entget a)
      )
     (setq p1 nil p2 nil)
     
     (if (equal (assoc 0 e) pl)
       (progn
    (setq p1 (cdr (assoc 10 e))
          e (subst '(x x) (assoc 10 e) e)
          )
    (setq p2 (cdr (assoc 10 e)))
    );_progn
       );_if
     
     (if (equal (assoc 0 e) li)
       (progn
    (setq p1 (cdr (assoc 10 e)))
    (setq p2 (cdr (assoc 11 e)))
    );_progn
       );_if

     (if (and (/= p1 nil)(/= p2 nil))
       (progn
    (command "offset" dis a (polar p1 (+ (angle p1 p2) (/ pi 2)) 3)
         a (polar p1 (- (angle p1 p2) (/ pi 2)) 3) "" )
    );_progn
       );_if
     
     (if (equal (assoc 0 e) arc)
       (progn
    (setq p1 (cdr (assoc 10 e)))
    (setq p2 (polar (cdr (assoc 10 e))
            (cdr (assoc 50 e))
            (* 2 (cdr (assoc 40 e)))
            )
          );_setq p2
    (command "offset" dis a p1  a p2 "")
    );_progn
       );_if

     );_while (< j i)
   
   (setvar "OSMODE" off)
   
   );_defun c:off_set