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

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


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

Всем привет.

 

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

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

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

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

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

В 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 эмодзи.

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

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

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

Загрузка...
  • Расскажите друзьям

    Нравится Официальный форум компании Нанософт? Расскажите друзьям!
×
×
  • Создать...