Тема: Как смастерить пересечение линий

Я конечно чайник в Автокаде, может быть вопрос банальный, но все же: как сделать так, чтобы при пересечении линий на чертеже в месте этого пересечения рисовался полукруг (требует заказчик). То есть одна линия остается прямой, а другая при пересечении "огибает" первую.

Re: Как смастерить пересечение линий

в отдел Lisp обратись если хочешь чтобы было атоматически

Re: Как смастерить пересечение линий

а ты лисп знаешь?
есть такая функция- (inters t1 t2 t3 t4). попробуй её. если nill возвратит- они не пересекаются. а если пересекаются- то точку пресечения.
если конечно лисп знаешь...

Re: Как смастерить пересечение линий

Да челу надо принципиальные схемы рисовать.  Если просто проводки пересекаются - полукруг, если стыкуются - точка.  Можно лиспу написать, чтобы при вставке блока- полукруга  обрезала линию по краям, но вставлять все равно ручками...

Re: Как смастерить пересечение линий

Mожно сделать блок в виде полуокружности, которым затем оттриматьучасток линии. Если предстоит большая работа, процесс можно автоматизировать. Аналогичный вопрос был здесь, на этом форуме, месяца 3 назад. Спрашивали, как блоком прорезать линию под собой. Поищи по поиску словом Блок. Была предложена LISP-ка.
Как прорезать линию блоком будет показано в моей книге, которая вскоре должна выйти и главу из которой (не по теме блока) можно увидеть здесь: http://www.cad.dp.ua/stats/diesel.html и оценить стиль и манеру изложения

Re: Как смастерить пересечение линий

Autodesk Building System это делает, Plant 4D это делает и еще куча программ, предназначенных для рисования принципиальных схем. Зачем велосипед-то изобретать?

Re: Как смастерить пересечение линий

(defun C:LINECROSS ()
 (while
  (progn
   (setq e0 nil d0 nil)
   (if (setq e0 (car (entsel "\nSelect LINE: "))) ;выбор Отрезка
    (progn
     (prompt "\nThis is NOT a LINE.")
     (not (= (cdr (assoc 0 (setq d0 (entget e0)))) "LINE"))))))
 (if e0
  (progn
   (setq sp0 (cdr (assoc 10 d0)) ep0 (cdr (assoc 11 d0))) ;начальная и конечная точки Отрезка
   (grdraw sp0 ep0 1 1) ;выделение Отрезка
   (prompt "\nSelect crossing LINES...")
   (setq ss (ssget (list '(0 . "LINE")))) ;выбор пересекающих отрезков
   (if ss ;отрезки выбраны
    (progn
     (setq dist_list ()) ;список_расстояний в формате ((длина координаты_точки_пересечения)...)
     (setq i 0)
     (repeat (sslength ss)
      (setq d (entget (setq e (ssname ss i)))) ;сведения об очередном отрезке
      (setq sp (cdr (assoc 10 d)) ep (cdr (assoc 11 d))) ;начальная и конечная точки очередного отрезка
      (if (setq cp (inters sp0 ep0 sp ep T)) ;точка_пересечения есть
       (if (not (apply 'or (mapcar '(lambda (_p) (equal (distance cp _p) 0.0 1e-13)) (list sp0 ep0 sp ep)))) ;очередной отрезок не примыкает и не проходит через концы Отрезка
        (setq dist_list (cons (cons (distance sp0 cp) cp) dist_list)))) ; пополнение списка_расстояний
      (setq i (1+ i)))
     (setq radius
      (if
       (setq
        new_radius
        (progn
         (initget (+ (if (> radius 0.0) 0 1) 2 4))
         (getreal (strcat "\nRadius" (if (> radius 0.0) (strcat " <" (rtos radius) ">") "") ": ")))) ;радиус дуги
       new_radius
       radius))
     (setq lwpline_list
      (mapcar 'cons
       (list 0 100 67 410 8 100 90 70 43 38 39)
       (list "LWPOLYLINE" "AcDbEntity" (cdr (assoc 67 d0)) (cdr (assoc 410 d0)) (cdr (assoc 8 d0)) "AcDbPolyline" 0 0 0.0 0.0 0.0))) ;"заголовок" полилинии
     (setq vertex_count 0) ;количество вершин
     (setq
      lwpline_list
      (append lwpline_list
       (mapcar 'cons
        (list 10 40 41 42)
        (list sp0 0.0 0.0 0.0))) ;первая вершина полилинии
      vertex_count (1+ vertex_count))
     (while dist_list ;точки пересечения не кончились
      (setq prox_list (assoc (apply 'min (mapcar 'car dist_list)) dist_list)) ;обнаружение очередной ближайшей к начальной точке Отрезка точки_пересечения
      (setq cp (cdr prox_list)) ;координаты точки_пересечения
      (setq
       lwpline_list
       (append lwpline_list
        (mapcar 'cons
         (list 10 40 41 42)
         (list (polar cp (angle cp sp0) radius) 0.0 0.0 1.0))) ;сегмент от точки_пересечения в сторону начальной точки (дуговой)
       vertex_count (1+ vertex_count))
      (setq
       lwpline_list
       (append lwpline_list
        (mapcar 'cons
         (list 10 40 41 42)
         (list (polar cp (angle cp ep0) radius) 0.0 0.0 0.0))) ;сегмент от точки_пересечения в сторону конечной точки (линейный)
       vertex_count (1+ vertex_count))
      (setq dist_list (apply 'append (mapcar '(lambda (_x) (if _x (list _x))) (subst nil prox_list dist_list))))) ;сокращение списка_расстояний
     (setq lwpline_list
      (append lwpline_list
       (mapcar 'cons
        (list 10 40 41 42)
        (list ep0 0.0 0.0 0.0))) ;последняя вершина полилинии
      vertex_count (1+ vertex_count))
     (setq
      lwpline_list
      (append lwpline_list
       (mapcar 'cons
        (list 210)
        (list '(0 0 1))))) ;нормаль
     (setq lwpline_list (subst (cons 90 vertex_count) (assoc 90 lwpline_list) lwpline_list)) ;замена количества вершин
     (entmake lwpline_list) ;создание полилинии
     (entdel e0))) ;удаление Отрезка
   (redraw) ;стирание фантомного отрезка
  )
 )
 (prin1)
)

Выбираете Отрезок, который будет "огибать" поперечные отрезки (прочие типы объектов игнорируются). Он подсвечивается красным. Затем выбираете поперечные отрезки. Они подсвечиваются. Задаете радиус (можно использовать значение по умолчанию). Отрезок (в целях сохранения целостности) заменяется полилинией (с дуговыми сегментами в местах пересечений). Отрезки, заканчивающиеся точно на линии Отрезка, а также проходящие через конечные точки Отрезка, игнорируются.

Re: Как смастерить пересечение линий

Хороший вопрос задал AndrewP! Вечный вопрос: зачем изобретать велосипед?
Автокад задуман так, чтобы каждый смог изобрести свой собственный велосипед. Это и называется адаптацией, и для этого есть одноименное диалоговое окно- Customize, и еще Load/Unload applications. Оно- как гараж для велосипедов, таких, как LISP от VH. Свой велосипед едет быстрей и по более ровной дороге, чем общественный автобус, да и платить У.Е. не надо

Re: Как смастерить пересечение линий

должен подтвердить: книга написана очень внятно и доступно. (судя по тем главам, которые я смог уже прочесть).
половина проблем с лиспом отпала (он просто не нужен)

Re: Как смастерить пересечение линий

Здравствуйте!
Возможноли переделать этот лисп, что бы он не только с line работал,а и с Pline ?

Re: Как смастерить пересечение линий

Люди помогите пожалуйста, очень нужен лисп этот