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

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

Как программно соединить полилинию, часть которой удалена под блоком

Ответ
Поиск в этой теме
Непрочитано 18.04.2018, 20:51 #1
Как программно соединить полилинию, часть которой удалена под блоком
Alex_Shaton
 
Гомель
Регистрация: 09.09.2017
Сообщений: 19

Я часто пользуюсь Lisp от Lee Mac - AutoBlockBreakV1-8.lsp отсюда - http://www.lee-mac.com/autoblockbreak.html. В полилинию вставляется блок, под блоком часть полилинии удаляется. Часто встречается и обратная задача - удалить указанный блок, соединить 2 конца полилинии. Поиск по форуму результатов не дал. Вариант решения нашел здесь -https://autocadtips1.com/2014/11/12/autolisp-updated-heal-linepolyline/. Сохранил в блокноте как Lisp, проверил на AutoCAD 2007 и AutoCAD2015_64, представленный там код не срабатывает (хотя описано, что код рабочий). Уважаемые гуру! Подскажите - это ошибка в коде или я что-то делаю не так. Или может есть другие варианты решения этой задачи?
Просмотров: 9213
 
Непрочитано 18.04.2018, 21:11
#2
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Alex_Shaton Посмотреть сообщение
Поиск по форуму результатов не дал.
Поиск по словам "Хитрый блок" многое покажет )
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.04.2018, 10:22
#3
Andrey_nadym


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


Пробовать надо. Читайте похожие темы

http://forum.dwg.ru/showthread.php?t=8284
https://dwg.ru/dnl/607

https://forum.dwg.ru/showthread.php?t=95515
https://forum.dwg.ru/showthread.php?t=33696
https://forum.dwg.ru/showthread.php?t=143411

https://www.google.ru/search?q=%D1%8...w=1920&bih=974
Andrey_nadym вне форума  
 
Непрочитано 19.04.2018, 14:31
| 1 #4
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от Alex_Shaton Посмотреть сообщение
В полилинию вставляется блок, под блоком часть полилинии удаляется.
А нарисовать в блоке Wipeout по графике блока не проще будет?
koMon вне форума  
 
Непрочитано 19.04.2018, 15:56
#5
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<phrase 1=


Цитата:
Сообщение от koMon Посмотреть сообщение
А нарисовать в блоке Wipeout по графике блока не проще будет?
Сие не всегда оправдано, ибо wipeout это по сути рисунок, и отсюда бывает появляются проблемы, особенно если не подгружены соответствующие библиотеки.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:

Последний раз редактировалось zenon, 19.04.2018 в 16:10.
zenon вне форума  
 
Непрочитано 19.04.2018, 17:58
#6
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от zenon Посмотреть сообщение
и отсюда бывает появляются проблемы,
при всём уважении, из встроенного мануала:
"Because a wipeout object is similar to a raster image, it has the same requirements for plotting. You need a raster-capable plotter with either an ADI 4.3 raster-capable driver or the system printer driver."
"Поскольку объект Wipeout идентичен растровой картинке, для его печати требуются те же требования. Вам необходим плоттер, способный печатать растровую графику с ADI 4.3 драйвером или драйвер для принтера из набора операционной системы."
Но, имхо, внести необратимые изменения в графические примитивы, порезкой например полилинии - совсем не комильфо(
koMon вне форума  
 
Непрочитано 19.04.2018, 18:15
#7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от koMon Посмотреть сообщение
Но, имхо, внести необратимые изменения в графические примитивы, порезкой например полилинии - совсем не комильфо(
ну поскольку это программная ветка, но не совсем необратимо) Просто как-то должны запоминаться (например, в расширенных данных) - что данные отдельные примитивы когда то являлись частью целого и каким объектом была "разбита" полилиния. А потом в событии/реакторе удаления данного объекта "склеивать" полилинии и модифицировать их расширенные данные.
Сергей812 вне форума  
 
Непрочитано 19.04.2018, 18:16
#8
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<phrase 1=


koMon, ну как пример:
https://forum.dwg.ru/showthread.php?t=130510
https://forum.dwg.ru/showthread.php?t=6571
https://forum.dwg.ru/showthread.php?t=20031

как сказал, может вызвать проблемы.
Причем тут печать не понял.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Автор темы   Непрочитано 19.04.2018, 21:14
#9
Alex_Shaton


 
Регистрация: 09.09.2017
Гомель
Сообщений: 19


Большое спасибо всем за ответы, буду копать дальше
Alex_Shaton вне форума  
 
Непрочитано 20.04.2018, 06:58
#10
baksconstructor


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


Наверно надо приложить пример, и заодно написать в поиск исполнителей.
baksconstructor вне форума  
 
Непрочитано 20.04.2018, 08:41
#11
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


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

----- добавлено через ~8 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну поскольку это программная ветка, но не совсем необратимо) Просто как-то должны запоминаться (например, в расширенных данных) - что данные отдельные примитивы когда то являлись частью целого и каким объектом была "разбита" полилиния. А потом в событии/реакторе удаления данного объекта "склеивать" полилинии и модифицировать их расширенные данные.
это очень идеальный и очень сложный вариант решения. но к примеру можно найти крайние точки касания контура блока остатков того, что было под блоком и соединить их сравняв их координаты. вот только если этих остатков будет не от одного примитива?

Последний раз редактировалось koMon, 20.04.2018 в 08:57.
koMon вне форума  
 
Непрочитано 20.04.2018, 09:38
#12
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от koMon Посмотреть сообщение
это очень идеальный и очень сложный вариант решения. но к примеру можно найти крайние точки касания контура блока остатков того, что было под блоком и соединить их сравняв их координаты. вот только если этих остатков будет не от одного примитива?
Этот вопрос надо решать в момент "разбивки" блоком полилинии - когда создает две полилинии вместо одной, то в расширенные данные эти полилиний прописывается какой то общий идентификатор и ссылка на хэндл блока. Когда блок удаляется - по его хендлу ищется совокупность групп разбитых им полилиний, а затем уже анализ их геометрии для поиска ближайших друг к другу конечных узлов полилинии с последующим соединением. Ничего тут идеального нет, просто несколько связанных подзадач.
Сергей812 вне форума  
 
Непрочитано 20.04.2018, 10:08
#13
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Ничего тут идеального нет
я имел в виду буквально следующее: идеальный ≡ совершенный
koMon вне форума  
 
Непрочитано 20.04.2018, 10:21
#14
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


ну скорее не совершенный, а реализуемый с предсказуемой логикой работы)
Сергей812 вне форума  
 
Непрочитано 20.04.2018, 12:05
#15
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,917
<phrase 1=


koMon, кстати, а стандартную команду СОЕДИНИТЬ (_join) почему не попробовать?
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 20.04.2018, 15:32
#16
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


zenon, я думаю можно и join, но это командный метод...
koMon вне форума  
 
Непрочитано 20.04.2018, 16:13
#17
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Эту команду тоже надо откуда то "дергать", не руками же вызывать каждый раз. И насколько помню - в событиях/реакторах очень не рекомендуется использовать командные методы.
Сергей812 вне форума  
 
Непрочитано 20.04.2018, 16:24
#18
Boxa

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


Что то вы переусложнили... ИМХО, достаточно поверх существующего примитива овердравит нужное отображение. Да, работать будет только при загруженной библиотеке, но имхо это меньшее из зол.
Boxa вне форума  
 
Непрочитано 20.04.2018, 16:31
#19
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Boxa Посмотреть сообщение
достаточно поверх существующего примитива овердравит нужное отображение. Да, работать будет только при загруженной библиотеке, но имхо это меньшее из зол.
Цитата:
Сообщение от Alex_Shaton Посмотреть сообщение
Часто встречается и обратная задача - удалить указанный блок, соединить 2 конца полилинии.
две разные задачи всетаки, имхо.
Сергей812 вне форума  
 
Непрочитано 20.04.2018, 16:39
#20
Boxa

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


Приведу Вашу же цитату:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну поскольку это программная ветка, но не совсем необратимо) Просто как-то должны запоминаться (например, в расширенных данных) - что данные отдельные примитивы когда то являлись частью целого и каким объектом была "разбита" полилиния. А потом в событии/реакторе удаления данного объекта "склеивать" полилинии и модифицировать их расширенные данные.
Проще не разбивать и реакторы ставить, а просто перерисовывать отображение. Добавили блок, нарисовали разрыв, убрали блок - убрали и разрыв.
Если же исполнителю досталось разгребать последствия чей то работы... тут можно только посочувствовать.
Boxa вне форума  
 
Непрочитано 20.04.2018, 16:44
#21
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Boxa Посмотреть сообщение
Проще не разбивать и реакторы ставить, а просто перерисовывать отображение. Добавили блок, нарисовали разрыв, убрали блок - убрали и разрыв.
потом кто-то в той же фирме открывает в том же бесплатном просмоторщике TrueView чертеж и что он там увидит?
Сергей812 вне форума  
 
Непрочитано 20.04.2018, 16:59
#22
Boxa

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


Может увидеть как линию поперек блока, так и нормальную картинку, что линия прерывается.
Зависит от реализации и потребностей.
Boxa вне форума  
 
Непрочитано 20.04.2018, 17:28
#23
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


а еще от того:
- нужна ли общая длина полилинии (типичная задача для той же электрики/слаботочки - устройства "гирляндой" на кабеле/шлейфе);
- требуется ли работа с этими частями полилинии как с единым целым.

Цитата:
Сообщение от Boxa Посмотреть сообщение
Может увидеть как линию поперек блока, так и нормальную картинку, что линия прерывается.
а почему он не может увидеть просто два отдельных примитива или одну целую полилинию?) Лишь бы приложение-просмоторщик понимало формат dwg.
Сергей812 вне форума  
 
Непрочитано 21.04.2018, 07:39
#24
Boxa

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


Сергей812, и? Да все это может потребоваться и да, все это можно реализовать.
Я хотел донести простую мысль, что работать и оперировать одним элементом намного проще, чем осколками.
А как это реализовать, дело десятое и зависит от потребностей: от овердравинга полилиии/мультилинии до собственного объекта или псевдо объекта на основе анонимного блока.

ЗЫ.
Кстати, вот к мульмилинии я присмотрелся бы повнимательнее, т.к. она штатно может содержать разрывы в отображении при этом оставаясь единым объектом...
Boxa вне форума  
 
Непрочитано 21.04.2018, 10:41
#25
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Boxa Посмотреть сообщение
А как это реализовать, дело десятое и зависит от потребностей: от овердравинга полилиии/мультилинии до собственного объекта или псевдо объекта на основе анонимного блока.
Конечный результат (чертеж) не должен зависеть от каких либо надстроек) Если человеку нужны полилинии, соединяющие объекты и механизм для оперативного/полуавтоматического/автоматического их разрыва и склеивания - зачем ему предлагать механизмы перерисовки или имитацию полилинии в виде других объектов?
Сергей812 вне форума  
 
Непрочитано 21.04.2018, 10:50
#26
Boxa

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


Сергей812, Вы меня как будто не слышите... если результат не должен зависеть от надстроек, значит надо реализовать так, что бы не зависел.
В любом случае, теперь у автора есть больше информации к размышлению и автор сам определиться как ему делать.
Boxa вне форума  
 
Непрочитано 23.04.2018, 12:14
#27
Andrey_nadym


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


Вот это попробуйте

http://cadsupport.ru/2014/11/lisp-me...e-under-block/
Andrey_nadym вне форума  
 
Непрочитано 23.04.2018, 12:29
#28
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Конечный результат (чертеж) не должен зависеть от каких либо надстроек)
Правильно. Конечный результат (чертеж) вообще не должен зависеть ни от чего, в том числе ни от инструментов, ни от исполнителей.
Setvar вне форума  
 
Автор темы   Непрочитано 23.04.2018, 19:43
#29
Alex_Shaton


 
Регистрация: 09.09.2017
Гомель
Сообщений: 19


Andrey_nadym, как раз вот по этой ссылке не работает, к тому же это только для линий, а не полилиний.
Alex_Shaton вне форума  
 
Непрочитано 25.04.2018, 08:56
#30
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от Alex_Shaton Посмотреть сообщение
а не полилиний.
вот мне интересно, в ваших посечённых полилиниях есть дуговые сегменты?
koMon вне форума  
 
Автор темы   Непрочитано 25.04.2018, 19:17
#31
Alex_Shaton


 
Регистрация: 09.09.2017
Гомель
Сообщений: 19


Сегменты полилиний, как правило, прямые. Дуговые встречаются, но очень редко
Alex_Shaton вне форума  
 
Непрочитано 03.05.2018, 10:18
1 | #32
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Alex_Shaton Посмотреть сообщение
Вариант решения нашел здесь -https://autocadtips1.com/2014/11/12/autolisp-updated-heal-linepolyline/. Сохранил в блокноте как Lisp, проверил на AutoCAD 2007 и AutoCAD2015_64, представленный там код не срабатывает (хотя описано, что код рабочий). Уважаемые гуру! Подскажите - это ошибка в коде или я что-то делаю не так.
Код рабочий, но только в английской версии. В русской надо добавить подчёркивание перед "C" вот тут:
Код:
[Выделить все]
 (setq objs (ssget "_C"
После этого работает.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 03.05.2018, 19:44
#33
Alex_Shaton


 
Регистрация: 09.09.2017
Гомель
Сообщений: 19


Do$, большое спасибо! Проверил - работает!
Alex_Shaton вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как программно соединить полилинию, часть которой удалена под блоком



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возможно ли сделать динамический блок, чтобы одна часть его была аннотативная, а другая нет? Falaleichik Динамические блоки 6 31.01.2022 17:44
Как программно закрыть полилинию Peter123 Программирование 8 11.05.2012 08:57
как программно создать полилинию? mamuk Программирование 5 30.05.2011 11:44
Программно заполнить рамку чертежами и открыть другую solo123 Программирование 2 25.02.2011 19:46
подскажите как программно начертить линии разных типов Александер Программирование 4 30.06.2005 07:17