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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как при пересечении двух линий сделать установку нужного блока в месте пересечения

Как при пересечении двух линий сделать установку нужного блока в месте пересечения

Ответ
Поиск в этой теме
Непрочитано 03.10.2012, 11:38 #1
Как при пересечении двух линий сделать установку нужного блока в месте пересечения
128500
 
Регистрация: 21.08.2012
Сообщений: 42

Поясню свою проблему и желательный результат, которого хотелось бы добиться. Возможно, я хочу слишком многого, но я поясню, а там надеюсь вы подскажете, что из перечисленного можно реализовать.
Суть проблемы состоит в том, что нужно организовать "правильное" взаимодействие линий на чертеже по электрике, а именно функцию наложения с пересечением и функцию наложения линий без пересечения.
Наложение с пересечением:
1. На чертеже уже имеется полилиния А
2. При чертеже новой полилинии Б, которая пересекается с полилинией А в месте их пересечения вставляется блок В.
Блок В по замыслу представляет собой либо тупо кружок, либо обозначение распаечной коробки. Но я думаю это неважно.
Наложение без пересечения:
1. На чертеже уже имеется полилиния А
2. При чертеже новой полилинии Б, которая пересекается с полилинией А в месте их пересечения вставляется полукруг определенного радиуса, линия Б обрезается по полукругу и данный полукруг добавляется к полилинии Б для обеспечения непрерывности полилинии Б и сохранения данных о ее длине.

В моем AutoCad 2012 Electrical (версия ОС XP 32bit) есть панель, выполняющая все данные функции, но она работает с объектом "провод", который есть суть отрезок, а не полилиния. Мне важно чтобы это работало и с полилиниями, причем полилинии оставались непрерывными от начала до конца.
Вообще великолепно если бы это все еще и на кнопку можно было повесить и работало как с "проводом" - нажимаешь кнопку "с пересечением" и чертишь полилинию, при этом в месте пересечения со всеми другими полилиниями вставляется определенный блок; нажимаешь "без пересечения", чертишь полилинию, в месте ее пересечения с другими вставляются полукруги и добавляются к исходной без нарушения ее целостности.

Буду очень признателен за помощь.
Просмотров: 12784
 
Непрочитано 03.10.2012, 12:24
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Расписал хорошо - с первого раза понятно - примеры рисуй.
Offtop: правда мне сейчас особо не когда, но быть может...
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 03.10.2012, 12:53
#3
128500


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


Вот файл с примерным видом того как должно быть
Вложения
Тип файла: dwg
DWG 2010
Чертеж1.dwg (61.8 Кб, 3424 просмотров)
128500 вне форума  
 
Непрочитано 03.10.2012, 17:03
1 | #4
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Набросал без проверок и пр:
Код:
[Выделить все]
  (vl-load-com)
(defun col->list (obj / ret)
  (vlax-for item obj (setq ret (cons item ret)))
  (reverse ret))
 (defun over-line (line R)
 ((lambda (split3 obj doc)
    (vla-startundomark doc)
    (mapcar '(lambda (ent)
               (mapcar '(lambda (pt)
                            (if (= (type R) 'str) 
                                (entmakex (list '(0 . "insert") (cons 10 pt) (cons 2 R)))
                                  ((lambda (param)
                                     (if (and (not (equal (vlax-curve-getparamatpoint obj pt) 0.0 0.0001))
                                              (/= param (vlax-curve-getendparam obj)))
                                         (progn
                                           (vla-addvertex
                                             obj
                                             (1+ param)
                                             (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 1))
                                                                  (polar (reverse (cdr (reverse pt)))
                                                                         (angle pt (vlax-curve-getpointatparam obj param))
                                                                         R)))
                                           (vla-addvertex
                                             obj
                                             (+ param 2)
                                             (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 1))
                                                                  (polar (reverse (cdr (reverse pt)))
                                                                         (angle pt (vlax-curve-getpointatparam obj (+ param 2)))
                                                                         R)))
                                           (vla-setbulge obj (1+ param) 1))))
                                   (fix (vlax-curve-getparamatpoint obj pt))))) 
                       (split3 ((lambda (var) (if (> (vlax-safearray-get-u-bound var 1) 0)
                                                  (vlax-safearray->list var)))
                               (vlax-variant-value (vla-intersectwith obj (vlax-ename->vla-object ent) acExtendNone))))))
            (vl-remove line
              (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_a" (cons '(0 . "LWPOLYLINE")
                                                                            (cons '(-4 . "<OR")
                                                                              (reverse 
                                                                                (cons '(-4 . "OR>")
                                                                                 (mapcar '(lambda (x) (cons 8 (vla-get-name x)))
                                                                                         (vl-remove-if-not 
                                                                                           '(lambda (x) (= (vla-get-layeron x) :vlax-true))
                                                                                           (col->list (vla-get-layers doc))))))))))))));ну поленился я - пусть все проверяет
              (vla-endundomark doc))
     (lambda (lst);split3
        (if lst (cons (list (car lst) (cadr lst) (caddr lst))
                      (split3 (cdddr lst)))))
     (vlax-ename->vla-object line);obj
     (vla-get-activedocument (vlax-get-acad-object))));doc
запускать (over-line pln XXX)
где pln - ename указатель на полилинию, XXX радиус дуги (если обводить) или имя существующего блока обозначения пересечения (если пересекать).
То есть - повесить на кнопки следующие макросы:
для пересечения сразу после рисования -
(command "_pline" (while (= (getvar "CMDACTIVE") 1) (command "\\")))(over-line (entlast) "имя_блока_пересечения")
для огибания -
(command "_pline" (while (= (getvar "CMDACTIVE") 1) (command "\\")))(over-line (entlast) 50)
где 50 радиус дуги огибания;
для "обрисовки" уже существующей -
(over-line (car (entsel)) 50)
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 05.10.2012 в 15:16.
Дима_ вне форума  
 
Автор темы   Непрочитано 03.10.2012, 18:03
#5
128500


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


Собственно, так и сделал.
Конкретнее, создал новую команду, в поле "Макрос" прописал
Цитата:
^C^C(command "_pline" (while (= (getvar "CMDACTIVE") 1) (command "\\")))(over-line (entlast) пересечение)
потом
Цитата:
^C^C(command "_pline" (while (= (getvar "CMDACTIVE") 1) (command "\\")))(over-line (entlast) "пересечение")
потом
Цитата:
^C^C(command "_pline" (while (= (getvar "CMDACTIVE") 1) (command "\\")))(over-line (entlast) 50)
"пересечение" называется мой блок, содержащий круг
Во всех случаях нажатие на кнопку, к которой приартачен макрос, вызывает появление в командной строке
Цитата:
(command "_pline" (while (= (getvar "CMDACTIVE") 1) (command "
с просьбой что-то ввести видимо. Пока незнаю что.
128500 вне форума  
 
Непрочитано 03.10.2012, 22:30
#6
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


А с кнопкой позабыл замени везде (command "\\") на (command pause)
p/s/ правильно там где "пересечение"
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 03.10.2012 в 22:48.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.10.2012, 08:53
#7
128500


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


Ну к сожалению пока тоже не получается.
Прописывание макросов
Цитата:
^C^C(command "_pline" (while (= (getvar "CMDACTIVE") 1) (command pause)))(over-line (entlast) "пересечение")
Цитата:
^C^C(command "_pline" (while (= (getvar "CMDACTIVE") 1) (command pause)))(over-line (entlast) 50)
при нажатии на кнопку заставляет чертить полилинию, чертятся они нормально без ошибок, но в местах пересечений ничего не образуется
Цитата:
(over-line (car (entsel)) 50)
вызывает сообщение
Цитата:
Выберите объект: ; ошибка: no function definition: OVER-LINE
подумал что может это не весь код а концовка измененная предыдущего, но макрос
Цитата:
^C^C(command "_pline" (while (= (getvar "CMDACTIVE") 1) (command pause)))(over-line (car (entsel)) 50)
тоже просто чертит полилинию
128500 вне форума  
 
Непрочитано 04.10.2012, 09:12
#8
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от 128500 Посмотреть сообщение
Выберите объект: ; ошибка: no function definition: OVER-LINE
так "еёж" (тот самый код который в начале сообщения) загрузить надо (от того что она на dwg.ru опубликованна, Autodesk, пока еще, ее автоматом не находит), как загрузить - в поиск на форуму (в простом варианте - текстовку сохранить в *.lsp (копировать с форума через всплавающею панельку БЕЗ номеров строк) файл и "зататащить" его в окно автокада).

з.ы. Кстати, об автоматической загрузки с форума. Господа! А может сами сделаем? Чтоб зараза, или просто не грамотный, по отношению к другим код, не проникала - попросим модераторов и иных уважаемых добровольцев инспектировать, ну и выделим раздел, надо только по именам стандартизировать.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 04.10.2012 в 09:18.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.10.2012, 09:17
#9
128500


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


Да не, уж это я сделал. Создал файл over-line.lsp с содержимым
Цитата:
(vl-load-com)
(defun over-line (line R)
((lambda (split3 obj doc)
(vla-startundomark doc)
(mapcar '(lambda (ent)
(mapcar '(lambda (pt)
(if (= (type R) 'str)
(entmakex (list '(0 . "insert") (cons 10 pt) (cons 2 R)))
((lambda (param)
(if (and (not (equal (vlax-curve-getparamatpoint obj pt) 0.0 0.0001))
(/= param (vlax-curve-getendparam obj)))
(progn
(vla-addvertex
obj
(1+ param)
(vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 1))
(polar (reverse (cdr (reverse pt)))
(angle pt (vlax-curve-getpointatparam obj param))
R)))
(vla-addvertex
obj
(+ param 2)
(vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 1))
(polar (reverse (cdr (reverse pt)))
(angle pt (vlax-curve-getpointatparam obj (+ param 2)))
R)))
(vla-setbulge obj (1+ param) 1))))
(fix (vlax-curve-getparamatpoint obj pt)))))
(split3 ((lambda (var) (if (> (vlax-safearray-get-u-bound var 1) 0)
(vlax-safearray->list var)))
(vlax-variant-value (vla-intersectwith obj (vlax-ename->vla-object ent) acExtendNone))))))
(vl-remove line
(vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_a" '((0 . "LWPOLYLINE"))))))));ну поленился я - пусть все проверяет
(vla-endundomark doc))
(lambda (lst);split3
(if lst (cons (list (car lst) (cadr lst) (caddr lst))
(split3 (cdddr lst)))))
(vlax-ename->vla-object line);obj
(vla-get-activedocument (vlax-get-acad-object))));doc
и поставил его в автозагрузку через Сервис -> AutoLisp -> Приложения
128500 вне форума  
 
Непрочитано 04.10.2012, 09:19
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


команда (list over-line) что выдает?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.10.2012, 09:21
#11
128500


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


Выдается
Цитата:
Команда: (list over-line)
(#<SUBR @2a6931b8 OVER-LINE>)
128500 вне форума  
 
Непрочитано 04.10.2012, 09:26
#12
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


давай еще раз полный лог команды (должно вначале штатно нарисовать полилинию, а потом вставить блоки/дуги в местах пересечения с другими)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.10.2012, 09:32
#13
128500


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


А извини пожалуйста, все работает.
Дело в моей косорукости как юзера.
Просто я привык полилинии рисовать, в конце нажимая Esc. Правильно команду завершать нажимая Enter. Как только стал нажимать Enter, все стало работать.
Ты меня второй раз уже выручаешь. С меня пиво
128500 вне форума  
 
Непрочитано 04.10.2012, 09:34
#14
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от 128500 Посмотреть сообщение
Просто я привык полилинии рисовать, в конце нажимая Esc.
Это старая тема - которую в общем можно обработать, но да ладно.
Offtop:
Цитата:
С меня пиво
- не только водку.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.10.2012, 09:35
#15
128500


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


Если б можно, то отлично. Ну а нет так нет, и так зашибись.

Последний раз редактировалось 128500, 04.10.2012 в 09:46.
128500 вне форума  
 
Непрочитано 04.10.2012, 09:55
#16
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


тады код кнопки макроса замени на
((lambda (fn entl)
(vl-catch-all-apply 'fn ())
(if (not (equal entl (entlast)))
(over-line (entlast) 50)))
(lambda () (command "_pline" (while (= (getvar "CMDACTIVE") 1) (command pause))))
(entlast))
остальные соответственно
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.10.2012, 10:03
#17
128500


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


Ругается он мне. Видимо я неправильно прописываю макрос. "^C^C" писать только вначале этого или на каждой строке?
128500 вне форума  
 
Непрочитано 04.10.2012, 10:17
#18
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Ай эти кнопки - давай по другому: добавляешь в код
Код:
[Выделить все]
(defun c:over-line-50()
  ((lambda (fn entl)
     (vl-catch-all-apply 'fn ())
     (if (not (equal entl (entlast)))
         (over-line (entlast) 50)))
   (lambda () (command "_pline" (while (= (getvar "CMDACTIVE") 1) (command pause))))
   (entlast)))
а в кнопку пишешь ^C^Cover-line-50 ну и с перекрестьем - аналогично
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 04.10.2012, 10:20
#19
128500


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


Ясно. Спасибо, я пожалуй оставлю как есть, ибо для меня это уже слишком сложно.
В "оставить как есть" есть свой плюс - если в конце команды нажать Esc то начертится просто полилиния, а если Enter/Пробел то будут организовываться пересечения. Тем самым по этой кнопке можно начертить все что захочется.

Еще раз спасибо за труды.
128500 вне форума  
 
Автор темы   Непрочитано 05.10.2012, 12:28
#20
128500


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


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

Последний раз редактировалось 128500, 09.10.2012 в 16:55.
128500 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как при пересечении двух линий сделать установку нужного блока в месте пересечения

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание нового типа линий Apelsinov AutoCAD 915 08.07.2022 12:36
Разрыв в месте пересечения линий выносок Zorroko Конструкции зданий и сооружений 7 20.02.2009 18:42