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

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

LISP. MLINE по координатам PLINE

Ответ
Поиск в этой теме
Непрочитано 02.09.2013, 16:13 #1
LISP. MLINE по координатам PLINE
dreadnoult
 
Регистрация: 02.09.2013
Сообщений: 4

Привет всем.

Есть чертеж с кучей полилиний. Возможно ли по координатам этих полилиний построить мультилинии в другом слое? Помогите, пожалуйста. Лисп взорвал мозг

Всем спасибо.
Просмотров: 3792
 
Непрочитано 02.09.2013, 16:14
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


А тот факт, что мультилиния не может иметь дуговых сегментов, не смущает? Вообще - зачем такую задачку решать?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 02.09.2013, 16:20
#3
dreadnoult


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


Смущает, это новая для меня информация Но может вы предложите другой вариант решения. Полилинии - условные обозначения трубопровода, надо рядом с трубопроводом, параллельно ему, нарисовать кабель. Таким образом, что бы кабель саму трубу нигде не пересекал (трубопровод местами довольно извилистый). Мультилиния идеально подошла бы, но может есть еще проще варианты?
dreadnoult вне форума  
 
Непрочитано 02.09.2013, 16:21
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


_offset ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.09.2013, 16:29
#5
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от dreadnoult Посмотреть сообщение
может вы предложите другой вариант решения
Другой вариант - воспользоваться поиском. Минимум - в Тулпаке есть. Максимум - и лисп тоже.
Сейчас не могу искать - давно это было, но на этом форуме нарылось и написалось несколько программ для мультилиний.
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 02.09.2013, 16:37
#6
dreadnoult


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


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
воспользоваться поиском
Спасибо, поищу еще.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
_offset ?
Не подходит, к сожалению. Слишком много разрозненных отрезков полилиний.

Коллеги с autodesk.com помогли с решением. Это именно то, что хотел сделать:

Код:
[Выделить все]
 (defun c:pl2ml ( / e i l s )
    (if (setq s (ssget '((0 . "LWPOLYLINE"))))
        (repeat (setq i (sslength s))
            (setq e (ssname s (setq i (1- i)))
                  l (entget e)
            )
            (apply 'command
                (append '("_.mline")
                    (apply 'append
                        (mapcar
                            (function
                                (lambda ( x )
                                    (list "_non" (trans (cdr x) e 1))
                                )
                            )
                            (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) l)
                        )
                    )
                    (if (= 1 (logand 1 (cdr (assoc 70 l)))) '("_C") '(""))
                )
            )
        )
    )
    (princ)
)
Всем большое спасибо за отклики.

Последний раз редактировалось dreadnoult, 02.09.2013 в 16:42.
dreadnoult вне форума  
 
Непрочитано 02.09.2013, 16:42
#7
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Сшить отрезки и опять таки офсетом их
Boxa на форуме  
 
Автор темы   Непрочитано 02.09.2013, 16:46
#8
dreadnoult


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



А если сшить, тогда получаются пересечения старых полилиний и новых
dreadnoult вне форума  
 
Непрочитано 02.09.2013, 16:48
1 | #9
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от dreadnoult Посмотреть сообщение
Спасибо, поищу еще.
Поиск на мультилинии Можно ли вместо отрезков чертить сразу двумя паралельными линиями

Заменять полилинии на мультилинии - это хорошо. Но для работы с ними Автокад почти ничего не дал.
Насколько помню, общими усилиями создали почти все основные инструменты для работы с мультилиниями. Осталось две задачи из основных, но помню сейчас только одну из них - разбивать их так, чтобы получались не отрезки, а полилинии и сохранялись штриховки, если был фон.

Последний раз редактировалось АлексЮстасу, 02.09.2013 в 17:15.
АлексЮстасу вне форума  
 
Непрочитано 02.09.2013, 17:37
#10
VVA

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


Цитата:
Сообщение от dreadnoult Посмотреть сообщение
Но может вы предложите другой вариант решения.
1. LISP. Подобие в обе стороны(Смотреть команды OFF2 и MOFF2)
2. LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.
3. Looking for a LISP routine: Multiple Polyline Offset
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.09.2013, 18:11
#11
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030



Мультилинии для ряда случаев просто необходимы - когда геометрия нужна именно оси (или одной из линий), и когда нужна заливка полосы. А иногда очень удобны - при черчении параллельных. В том числе и потому, что не нужно помнить о расстояниях, стилях и пр. Есть неплохой набор команд для создания красивых пересечений и примыканий мультилиний, которые с множеством параллельных полилиний замучаешься делать.
Да, не хватает грамотного разбивания с преобразованием заливки в штриховку, с разбиванием на полилинии, а не на отрезки, с сохранением виртуальных разрывов и примыканий средствами Mline Edit.
И не хватает (вспомнил!) сшивания и разрезания мультилиний.
АлексЮстасу вне форума  
 
Непрочитано 02.09.2013, 19:03
1 | #12
VVA

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


Кое что по функционалу по мультилиниям было
Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
с разбиванием на полилинии
Convert Mline To Pline
Код:
[Выделить все]
(defun c:m2p (/ *error* EntNext_to_End DOC ELST ENT I MSS OV SS UFLAG VL)
  ;; MLine to PLine  ~  Lee Mac  ~  04.01.10

  (defun *error* (msg)
    (and ov    (mapcar (function setvar) vl ov))
    (and uflag (vla-EndUndoMark doc))
    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
        (princ (strcat "\n** Error: " msg " **")))
    (princ))

  (defun EntNext_to_End (ent / a)
    (if (setq ent (entnext ent))
      (cons ent (EntNext_to_End ent)))) 

  (setq vl '("CMDECHO" "PEDITACCEPT" "QAFLAGS")
        ov  (mapcar (function getvar) vl) ss (ssadd))

  (mapcar (function setvar) vl '(0 1 0))

  (if (setq i -1 mss (ssget "_:L" '((0 . "MLINE"))))
    (progn
      (setq uFlag (not (vla-StartUndoMark
                         (setq doc (vla-get-ActiveDocument
                                     (vlax-get-acad-object))))))

      (while (setq ent (ssname mss (setq i (1+ i))))
        (setq eLst (entlast) ss (ssadd))

        (vl-cmdf "_.explode" ent)

        (mapcar (function (lambda (x) (ssadd x ss)))
                (EntNext_to_End eLst))

        (vl-cmdf "_.pedit" "_M" ss "" "_J" "" "")
        (setq ss nil))

      (setq uFlag (vla-EndUndoMark doc))))

  (mapcar (function setvar) vl ov)
  (princ))

Плюс это (должно работать)
Код:
[Выделить все]
(defun C:MLR ( / ss lst nst ed crs clos _J osm cl *error*)
;;;Mline Reverse
  (defun *error* (msg )
;;;Прерываем активную команду  
    (while (> (getvar "CMDACTIVE") 0) (command))
    (setvar "CLAYER" cl)
    (princ msg)
    (princ)
 )
 (defun group-by-num (lst num / ls ret)
(if (= (rem (length lst) num ) 0)(progn (setq ls nil)
(repeat (/ (length lst) num)(repeat num (setq ls (cons (car lst) ls) lst (cdr lst)))
(setq ret (append ret (list (reverse ls))) ls nil)))) ret)  
(vl-load-com)
(setq cl (getvar "CLAYER"))    
(if (setq ss (ssget "_:L" '((0 . "MLINE"))))
  (progn
    (while (> (getvar "CMDACTIVE") 0) (command))
    (setq lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
    (foreach e1 lst
      (if (setq ed (entget e1) nst (cdr(assoc 2 ed)))
        (progn
          (setq crs (group-by-num (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates (vlax-ename->vla-object e1)))) 3))
          (setq clos (= (logand (cdr(assoc 71 ed)) 2) 2))
          (setq _J (cond ((= 0 (cdr(assoc 70 ed))) "_T")
                         ((= 1 (cdr(assoc 70 ed))) "_Z")
                         (t "_B")))
          (setq osm (getvar "OSMODE"))
          (setvar "OSMODE" 0)
          (setvar "CLAYER" (cdr(assoc 8 ed)))
          (command "_MLINE" "_J" _J "_ST" nst "_S" (cdr(assoc 40 ed)))
          (foreach pt (reverse crs)
            (command (trans pt 0 1)))
          (command (if clos "_C" ""))
          (setvar "OSMODE" osm)
          (mapcar
	   '(lambda (x y) (vlax-put-property (vlax-ename->vla-object (entlast)) x y))
	   '(Linetype LineWeight Color Layer)
	   (mapcar
	     '(lambda (x)
		(vlax-get-property (vlax-ename->vla-object e1)  x))
	     '(Linetype LineWeight Color Layer)))
          (entdel e1)
          )
      )
    )
  )
  )
  (setvar "CLAYER" cl)
  (princ)
  )
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 03.09.2013, 02:03
#13
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,030


Цитата:
Сообщение от VVA Посмотреть сообщение
Плюс это (должно работать)
MLR - так понял, что это реверс мультилиний. Вполне может пригодиться.
m2p - достаточно неплохо разбивает мультилинии, преобразуя их именно в полилинии, в активный слой, сохраняет примыкания и пересечения. Осталось создавать соответствующую штриховку, если мультилиния была залитой. В принципе, было бы совсем здорово, если бы разные составляющие мультилиний можно было раскладывать еще и в свои-разные слои, и назначать толщины, но это возможно только при описании элементов мультилиний в специальном дополнительном файле.
m2p - не очень удачное название, т.к. была еще программка превращения мультилиний в их осевые полилинии. Но это даже для меня дело легко поправимое.
Спасибо!
АлексЮстасу вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. MLINE по координатам PLINE

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите, существуют ли практические руководства по Lisp? vn LISP 261 26.11.2015 13:27
LISP: центр масс фигуры по координатам WhiteShark Готовые программы 1 13.01.2015 22:14
Pline по координатам в Excel'e Georg Программирование 15 20.03.2011 22:40
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
Координаты точки пересечения line и pline (LISP) paradoxvaha LISP 3 10.07.2007 13:04