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

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

Вопрос: изменение свойств участка последовательно соединённых примитивов.

Ответ
Поиск в этой теме
Непрочитано 08.10.2009, 12:18 #1
Вопрос: изменение свойств участка последовательно соединённых примитивов.
Tonic
 
Воронеж
Регистрация: 26.06.2007
Сообщений: 151

Пусть имеется последовательность примитивов (отрезки, дуги, полилинии; контур м.б. замкнутым или незамкнутым). Необходимо задать 2 точки на этом "контуре", между которыми будет изменён тип линий (ну или цвет, к примеру). Существуют ли готовые решения для этой операции?
Тут нужно определить единый контур из последовательных сегментов, затем разорвать примитив или 2 примитива в указанных 2-х точках, после чего примитивы, которые находятся между этими указанными двумя точками преобразовать.
Просмотров: 6405
 
Непрочитано 08.10.2009, 13:15
#2
Do$

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


Вот это:
http://forum.dwg.ru/showthread.php?t=8284 (Комманда PL-JOIN)
Затем _BREAK два раза.
Do$ вне форума  
 
Автор темы   Непрочитано 08.10.2009, 14:36
#3
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Не совсем. Допустим, командой PL-JOIN (кстати, отличная вещь!) мы получили полилинию PLINE. Теперь делаем
(command "_break" "_F" p1 p1); для разрыва в первой точке
Для разрыва во второй точке надо бы сделать то же самое, но с p2, но имя примитива теперь не PLINE, т.к. мы его до этого разбили.
Tonic вне форума  
 
Непрочитано 08.10.2009, 14:53
#4
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Не разбили, а разорвали.
Profan вне форума  
 
Автор темы   Непрочитано 08.10.2009, 15:18
#5
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Велика ли разница? =)
Tonic вне форума  
 
Непрочитано 08.10.2009, 15:24
#6
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Разница велика. Если разорвать полилинию, то в результате получится две полилинии. А если ее разбить (взорвать, расчленить), то получим кучу отрезков и дуг.
Profan вне форума  
 
Непрочитано 08.10.2009, 15:36
#7
Do$

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


Цитата:
Сообщение от Tonic Посмотреть сообщение
но имя примитива теперь не PLINE
Не понял, что имеется в виду. После того, как полилинию разорвали, получаем две полилинии.
Одна из полилиний исходная, вторая - новый примитив с теми же свойствами:

Код:
[Выделить все]
...
(0 . "LWPOLYLINE")
(100 . "AcDbPolyline")
...
Do$ вне форума  
 
Автор темы   Непрочитано 08.10.2009, 15:42
#8
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Да, и после этого надо будет сначала создать список из этих двух полилиний, затем найти, какой из этих двух полилиний принадлежит вторая указанная точка, и разрывать уже ту полилинию. В результате получится 3 полилинии, из которых свойства средней нужно изменить. Наверно, только так.
Tonic вне форума  
 
Непрочитано 08.10.2009, 15:48
#9
Do$

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


Можно через ssget определить, какая полилиния проходит через указанную точку. При помощи него же определить среднюю полилинию (она будет начинаться и заканчиваться в указанных точках). Как то так...
Do$ вне форума  
 
Автор темы   Непрочитано 08.10.2009, 16:06
#10
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Если мы разрываем полилинию на две части, то они обе будут проходить через общую точку. А ssget, к тому же, найдёт только одну из этих линий.
Tonic вне форума  
 
Непрочитано 08.10.2009, 20:07
#11
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Tonic Посмотреть сообщение
А ssget, к тому же, найдёт только одну из этих линий.
По-моему, не совсем так.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.10.2009, 10:53
#12
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
По-моему, не совсем так.
У меня так. Попробуй начертить два отрезка буквой "Л" (галочка), затем ввести
(sslength (ssget (getpoint))), указав на их общую точку. Получится 1!
Tonic вне форума  
 
Непрочитано 09.10.2009, 11:09
#13
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Что за трудности? Объединили отрезки и дуги в одну полилинию, разорвали ее в двух точках, выбрали средний участок и меняем его свойства как хотим.
Profan вне форума  
 
Непрочитано 09.10.2009, 11:15
#14
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


А так:
Код:
[Выделить все]
 
(sslength (ssget "_C" (setq pt (getpoint)) pt))
CB вне форума  
 
Автор темы   Непрочитано 09.10.2009, 11:30
#15
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Цитата:
Сообщение от CB Посмотреть сообщение
А так:
А так работает, но до такого способа я не додумался =)
Цитата:
Сообщение от Profan Посмотреть сообщение
Объединили отрезки и дуги в одну полилинию, разорвали ее в двух точках, выбрали средний участок и меняем его свойства как хотим
Ну вот - это и есть целая программа, включающая в себя:
1. PL-JOIN - обхединение примитивов (могут быть и полилинии, и отрезки) в одну полилинию;
2. Указание двух точек для разрыва;
3. Разрыв в первой точке командой _break. После этого получаем две полилинии. Чем-то вроде entnext получаем из имена. Ищем, какой из них принадлежит вторая точка;
4. Разрыв одной из этих двух полилиний во второй точке.
5. Поиск двух новых полилиний и включение их в новый список; объединение этого списка с первым списком; Исключение из него примитива, который вернёт на Entget NIL (т.к. уже не будет существовать);
6. Поиск среднего отрезка из списка трёх полилиний (алгоритм - что-то вроде "если начальная точка соотв. нач. или кон. точке одной полилинии И конечная точка соотв. нач. или кон. точке другой полилинии")
7. Изменение свойств средней полилинии.

Но тут ещё один вопрос возникает. Если мы делаем это в цикле. Допустим, было 3 дуги/отрезка/полилинии. Мы объединили их в одну полилинию, потом поделили точками и изменили тип линии средней полилинии. Затем в начале след. цикла мы объединяем три полилинии в одну, НО тип линии у всех трёх полилиний становится одинаковым!
Tonic вне форума  
 
Непрочитано 09.10.2009, 11:39
#16
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Почему бы не оставить один запрос на выбор объекта явно?
Profan вне форума  
 
Автор темы   Непрочитано 09.10.2009, 12:01
#17
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


Цитата:
Сообщение от Profan Посмотреть сообщение
Почему бы не оставить один запрос на выбор объекта явно?
Выбор объекта - в смысле, средней полилинии? Так дело не в сложности её нахождения - алгоритм (пусть не самый лучший) я привёл. Дело в том, что изменить требуется участок от точки до точки, а в этих пределах может лежать 3 отрезка и 2 дуги, к примеру. Причём, нужно предусмотреть возможность выбора контура (если мы на замкнутом контуре указали 2 точки, то надо предложить выбрать, какой из 2 контуров имеется ввиду). И всё равно нужно эти примитивы по контуру объединять в полилинию и затем разбивать в указанных точках. Но при объединении в полилинию типы линий станут одинаковыми, а ведь до этого они могли быть различными. Вот проблема.
Tonic вне форума  
 
Непрочитано 09.10.2009, 12:20
#18
CB

Конструирование в области нефтеразведки
 
Регистрация: 10.02.2006
Гомель
Сообщений: 321


Выложи ты лучше пример: что было, что нужно получить...
CB вне форума  
 
Автор темы   Непрочитано 09.10.2009, 12:35
#19
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 151


На рисунке:
1. Так выглядит первоначальный контур;
2. Так выглядит контур, тип линий которого изменён полностью (ничего сложного)
3. Так должен выглядеть контур после того, как на нём укажут две точки (между ними изменится тип линии). Причём надо ещё и предложить на выбор: от точки 1 до точки 2 изменить тип или от точки 2 до точки 1!
4. А так может выглядеть контур, если после примера 3 пользователь покажет ещё 2 точки на нём же, между которыми также надо изменить тип линий.
P.S. Первоначально это блок, но с его расчленением и созданием списка старых/новых примитивов и обратным созланием блока вопросов нет.
Миниатюры
Нажмите на изображение для увеличения
Название: 222.jpg
Просмотров: 58
Размер:	13.4 Кб
ID:	27066  
Tonic вне форума  
 
Непрочитано 09.10.2009, 14:25
#20
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Имхо брать за основу PL-CSE из pltools и делать делать делать...
а также посмотреть программку myBreak
Sleekka вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Вопрос: изменение свойств участка последовательно соединённых примитивов.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как добраться до свойств примитивов AutoCAD Structural Detailing? AlexV Программирование 6 17.06.2015 21:17
Изменение свойств атрибута в составе блока rzinnurov AutoCAD 9 24.04.2009 15:17
Изменение параметров примитивов составляющих сложный блок. Theodor Программирование 5 19.04.2009 21:29
список свойств параметров примитивов leonardo23 AutoCAD 7 10.01.2007 09:02
Изменение свойств текстов и размеров Кулик Алексей aka kpblc Программирование 2 23.06.2005 16:11