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

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

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

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

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

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

Буду очень признателен за помощь.
Просмотров: 13436
 
Непрочитано 05.10.2012, 15:17
#21
Дима_

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


Добавил в #4.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 05.10.2012, 15:31
#22
128500


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


Спасибо, работает
И в порядке окончательной наглости - в #18 ты писал что нужно добавить в код чтобы команда срабатывала даже если в конце нажимается Esc а не Enter/Пробел.
Куда именно писать не подскажешь? Все таки надо чтобы и на отмену реагировало.
128500 вне форума  
 
Непрочитано 05.10.2012, 16:28
#23
Дима_

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


в код сверху или с низу не важно, можно отдельным lsp файлом и не забыть изменить макросы на кнопках
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 05.10.2012, 19:31
#24
128500


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


Совсем туго у меня с лиспом. Точнее не соображаю я ничего.
В общем лисп-файл с учетом добавленого в конец #18 получился
Код:
[Выделить все]
  (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

(defun c:over-line-100()
  ((lambda (fn entl)
     (vl-catch-all-apply 'fn ())
     (if (not (equal entl (entlast)))
         (over-line (entlast) 100)))
   (lambda () (command "_pline" (while (= (getvar "CMDACTIVE") 1) (command pause))))
   (entlast)))
Код макроса для кнопки "наложение полилиний без пересечением"
Цитата:
^C^Cover-line-100
работает отлично

Код макрос для кнопки "создание наложения без пересечения" для существующих полилиний
Цитата:
^C^C(over-line (car (entsel)) 100)
работает отлично

Код макроса для кнопки "наложение полилиний с пересечением" незнаю. Ты пишешь "по аналогии". Я попытался конечно написать что-то, но бред выходит.

P.S. Правда в лиспе смайлика нету

Последний раз редактировалось Кулик Алексей aka kpblc, 03.10.2014 в 13:54.
128500 вне форума  
 
Непрочитано 05.10.2012, 20:29
#25
Дима_

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


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


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


есть вопрос еще один - частенько при нажатии кнопки с макросом пишет
Цитата:
Команда: over-line-100 Неизвестная команда "OVER-LINE-100". Для вызова справки нажмите F1.
или соответственно
Цитата:
Команда: over-line-x Неизвестная команда "OVER-LINE-X". Для вызова справки нажмите F1.
При этом лисп-файл стоит в автозагрузке и грузится при запуске автокада.
Если автокад закрыть и открыть, снова работает. Так же начинает работать если загрузить его вручную еще раз.
Не знаешь в чем может быть проблема?

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

Последний раз редактировалось 128500, 09.10.2012 в 17:03.
128500 вне форума  
 
Непрочитано 05.05.2014, 13:35
#27
hellt


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


Если бы хоть что-то было понятно из кода лиспа, то я бы сделал еще ручной режим, когда клик на пересечение полилиний вставлял туда "огибающий" знак. Такой ручной режим часто полезнее, чем полный автомат
hellt вне форума  
 
Непрочитано 05.05.2014, 14:03
#28
Дима_

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


Цитата:
Сообщение от hellt Посмотреть сообщение
Если бы хоть что-то было понятно из кода лиспа, то я бы сделал еще ручной режим
Вы уверенны, что проблема в том что Вам не понятно?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 05.05.2014, 14:25
#29
hellt


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


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Вы уверенны, что проблема в том что Вам не понятно?
Я имел ввиду то, что синтаксис лиспа и объектная модель автокада мне не знакомы, поэтому несмотря на 50 строк кода ничего не могу дописать.
hellt вне форума  
 
Непрочитано 03.10.2014, 11:12
#30
shartal


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


Команда не работает к сожалению с аннотативными блоками.
shartal вне форума  
 
Непрочитано 03.10.2014, 13:55
#31
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от shartal Посмотреть сообщение
Команда не работает к сожалению с аннотативными блоками.
Какая именно? В чем выражается "не работает"?
Offtop: Ну почему надо тягать всю информацию...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 06.10.2014, 16:41
#32
shartal


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


Код из поста 4 не расставляет блоки. Команда проходит без вопросов, но блоки не расставляются.
shartal вне форума  
 
Непрочитано 06.10.2014, 23:18
#33
Дима_

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


Для дальнейшего разговора нужен лог команды
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 07.10.2014, 10:50
#34
shartal


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


Не верно описал проблему. На самом деле блоки расставляются, но они не видны. Их можно выбрать через Быстрый выбор или Выбрать подобные. При этом вставляются в масштабе 1:1, а не в текущем. (показывать объекты во всех аннот. масштабов включено). После добавления любого другого аннот. масштаба они становятся видимыми.
Миниатюры
Нажмите на изображение для увеличения
Название: 1.jpg
Просмотров: 108
Размер:	12.8 Кб
ID:	136294  
shartal вне форума  
 
Непрочитано 07.10.2014, 11:06
#35
Кулик Алексей aka kpblc
Moderator

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


Offtop: Интересно, чего еще не рассказано...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как при пересечении двух линий сделать установку нужного блока в месте пересечения



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