Перейти к содержанию
Ivanco

Штриховка полилинии отрезками

Рекомендуемые сообщения

Всем привет.

 

Задача такая: есть плоская полилиния произвольной сложности. Ее нужно "заштриховать" отрезками с указанным юзером интервалом и углом от XY.

Чето я алгоритмически не могу сообразить, как это сделать?)

Вероятно, для простоты надо "заштриховать" некий limiting box вокруг полилинии, а потом как то обрезать не нужное?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

например - проофсетить в обе стороны, замкнуть торцы и позвать обычный хэтч

hatch.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то мне другая картина рисовалась :) А можно результат показать задумки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я бы пошел по пути постройки отрезков и поиска их точек пересечения с полилинией.

В MC есть функции для поиска пересечений и определения внутри ли контура точка, но вот последняя глючила, скорее всего исправили (я давал заявку).

Изменено пользователем Robink

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Результат приложил.

Поллиния обязательно закрытая - это проверяется на входе в скрипт.

Штриховка не подходит (вроде как), т.к. я не могу задать отступ начальный от некого "края"(к примеру самой "левого").

post-45933-0-89813700-1557221624.png

Изменено пользователем Ivanco

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на самом деле в штриховке можно задать базовую точку паттерна. программно. по крайней мере на уровне OdDbHatch.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на самом деле в штриховке можно задать базовую точку паттерна. программно. по крайней мере на уровне OdDbHatch.

вообщем если штриховкой делать, нужны возможности:

- выставить базовую точку внутри основного контура программно

- программно задать расстояния между штрихами (я так понямаю это в .PAT где то прописано и множиться на масштаб ? как это считать с .pat? или использовать свой .pat?)

- угол задать программно (начальный опять же вероятно в .pat записан, его надо считать или как..)

- потом штриховку разбить (это вроде не проблема)

- получить в итоге набор отрезков , программно в виде массива.

 

Вроде задача выглядит решаемой , если все что выше можно сделать в API на .NET

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

увы... на дотнете нету нужных дырок.

остается раскладывать линии (тем более, если они все равно нужны по отдельности) и тупо обрезать их сегментами полилинии.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
остается раскладывать линии (тем более, если они все равно нужны по отдельности) и тупо обрезать их сегментами полилинии.

вот это я и не могу геометрически/алгоритмически собразить)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нууу... тут разные варианты возможны.

например так :

- считаем баунд полилинии

- в рамках этого баунда (начиная от пресловутой базовой точки) создаем пачку линий. можно обычных отрезков, можно XLINE - разница невелика

- дальше последовательно для каждой такой линии

--- считаем пересечения с полилайном (IntersectWith - есть такой метод, выдает набор точек пересечения)

--- сортируем эти точки по направлению линии

--- попарно создаем отрезочки (выходные)

 

есть тонкий момент : линия может *касаться* полилинии - например в вершине (или касаться дугового сегмента). в этом случае точка пересечения получится одна.

если она была первая - то она сломает "попарность". а если мы таким образом попадем в 2 вершины - то получим лишний ненужный отрезок. а если у нас линия совпадает с сегментом... в общем, тут надо аккуратно! :)

из незатейливых тестов - можно проверить серединки получившихся отрезочков на попадание внутрь полилинии - тогда будет понятно, какие нам нужны, а какие нет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нууу... тут разные варианты возможны.

например так :

- считаем баунд полилинии

- в рамках этого баунда (начиная от пресловутой базовой точки) создаем пачку линий. можно обычных отрезков, можно XLINE - разница невелика

- дальше последовательно для каждой такой линии

--- считаем пересечения с полилайном (IntersectWith - есть такой метод, выдает набор точек пересечения)

--- сортируем эти точки по направлению линии

--- попарно создаем отрезочки (выходные)

 

есть тонкий момент : линия может *касаться* полилинии - например в вершине (или касаться дугового сегмента). в этом случае точка пересечения получится одна.

если она была первая - то она сломает "попарность". а если мы таким образом попадем в 2 вершины - то получим лишний ненужный отрезок. а если у нас линия совпадает с сегментом... в общем, тут надо аккуратно! :)

из незатейливых тестов - можно проверить серединки получившихся отрезочков на попадание внутрь полилинии - тогда будет понятно, какие нам нужны, а какие нет

http://developer.nanocad.ru/redmine/boards/3/topics/1311?r=1647#message-1647

Ага уже плавали :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
остается раскладывать линии (тем более, если они все равно нужны по отдельности) и тупо обрезать их сегментами полилинии.

вот это я и не могу геометрически/алгоритмически собразить)

возможно поможет

_algolist.manual.ru/maths/geom/

_www.cad.dp.ua/stats/a_vba/

_www.cyberforum.ru/geometry/

сам недавно решал схожую задачу, пересечения двух окружностей построения к ним касательных.. получилось))

----------------------

недопиленная аналитика((

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вообщем решено было сперва пойти по простому пути и делать Explode() штриховки.

 

штриховка создается добавляется в чертеж. теперь мне надо ее разбить и получить набор линий. но я что то неправильно делаю..

в чем ошибка?

или вообще такое на MultiCAD не работает? в Teigha.NET API у Hatch вроде есть метод EXPLODE..

 

  
		    Hatch hatch = new Hatch(pl.Polyline, angle, spacing, false);
			DbGeometry dbhatch = new DbGeometry();
			dbhatch.Geometry = new EntityGeometry(hatch);// это ерунда? не совсем понимаю что тут происходит.
			dbhatch.DbEntity.AddToCurrentDocument();

			List<EntityGeometry> lns = new List<EntityGeometry>();
			lns = dbhatch.DbEntity.Explode();// почему тут не работает?

			foreach (EntityGeometry ln in lns)  
			{
				DbGeometry lnDb = new DbGeometry();
				lnDb.Geometry = ln;
				lnDb.DbEntity.AddToCurrentDocument();
			}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

диалог с самим собой), в "клуб разработчиков" впрочем тоже не отвечают конечно.

Еще пара вопросов:

 

1. нормально ли использовать чистый .NET API и MultiCAD.NET ? в том плане , что это вообще нормальная практика "смешивать" разные API в разработке.

 

2. ну ладно я нашел Explode() в "чистом" .NET nanoCAD API и оно работает). но мне нужно кой чего из Multicad.

 

как приводить объекты с одних типов к другим в данном случае?

К примеру из :

Teigha.DatabaseServices.Dbline ------->>

Multicad.DatabaseServices.StandardObjects.DbLine;

или обратно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

диалог с самим собой), в "клуб разработчиков" впрочем тоже не отвечают конечно.

Еще пара вопросов:

 

1. нормально ли использовать чистый .NET API и MultiCAD.NET ? в том плане , что это вообще нормальная практика "смешивать" разные API в разработке.

 

2. ну ладно я нашел Explode() в "чистом" .NET nanoCAD API и оно работает). но мне нужно кой чего из Multicad.

 

как приводить объекты с одних типов к другим в данном случае?

К примеру из :

Teigha.DatabaseServices.Dbline ------->>

Multicad.DatabaseServices.StandardObjects.DbLine;

или обратно.

Если работаете со стандартными примитивами, то лучше использовать Teigha. Передавать можно через передачу id.

 

из MC в Teigha

 

IntPtr id_intptr = id_mcobjectid.ToOldIdPtr();

 

ObjectId Id_objectid = new ObjectId(id_intptr);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...

×
×
  • Создать...