Перейти к содержимому


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


Сообщений в теме: 14

#1 Ivanco

    Дилер

  • Дилеры
  • PipPipPipPip
  • 346 сообщений
  • Пол:Мужчина
  • Город:Красноярск
  • Интересы:САПР

Отправлено 07 Май 2019 - 10:24

Всем привет.

Задача такая: есть плоская полилиния произвольной сложности. Ее нужно "заштриховать" отрезками с указанным юзером интервалом и углом от XY.
Чето я алгоритмически не могу сообразить, как это сделать?)
Вероятно, для простоты надо "заштриховать" некий limiting box вокруг полилинии, а потом как то обрезать не нужное?
"ИнфоИндастри" г.Красноярск,г.Иркутск,г.Владивосток-официальный дилер Нанософт
YouTube,GitHub - Ivanco21, using:C#/MultiCAD.NET

#2 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 512 сообщений
  • Пол:Мужчина

Отправлено 07 Май 2019 - 11:16

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

Прикрепленные файлы

  • Прикрепленный файл  hatch.jpg   78,38К   4 Количество загрузок:


#3 Kreator

    Активист

  • Пользователи
  • PipPipPipPip
  • 908 сообщений
  • Пол:Мужчина
  • Город:Краснодар

Отправлено 07 Май 2019 - 11:29

Что-то мне другая картина рисовалась :) А можно результат показать задумки?
Полховский А.В. Проектирование железнодорожных путей
nanoCAD Plus 11.0.4752.7008 (сборка 4857); MultiCAD.NET; Сравни чертежи

#4 Robink

    Активист

  • Пользователи
  • PipPipPipPip
  • 412 сообщений
  • Пол:Мужчина
  • Город:Казань
  • Интересы:САПРостроение

Отправлено 07 Май 2019 - 11:36

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

Сообщение отредактировал Robink: 07 Май 2019 - 11:38


#5 Ivanco

    Дилер

  • Дилеры
  • PipPipPipPip
  • 346 сообщений
  • Пол:Мужчина
  • Город:Красноярск
  • Интересы:САПР

Отправлено 07 Май 2019 - 12:33

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

Прикрепленные файлы


Сообщение отредактировал Ivanco: 07 Май 2019 - 12:33

"ИнфоИндастри" г.Красноярск,г.Иркутск,г.Владивосток-официальный дилер Нанософт
YouTube,GitHub - Ivanco21, using:C#/MultiCAD.NET

#6 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 512 сообщений
  • Пол:Мужчина

Отправлено 07 Май 2019 - 13:03

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

#7 Ivanco

    Дилер

  • Дилеры
  • PipPipPipPip
  • 346 сообщений
  • Пол:Мужчина
  • Город:Красноярск
  • Интересы:САПР

Отправлено 07 Май 2019 - 13:12

Просмотр сообщенияLion007 (07 Май 2019 - 13:03) писал:

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

Вроде задача выглядит решаемой , если все что выше можно сделать в API на .NET
"ИнфоИндастри" г.Красноярск,г.Иркутск,г.Владивосток-официальный дилер Нанософт
YouTube,GitHub - Ivanco21, using:C#/MultiCAD.NET

#8 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 512 сообщений
  • Пол:Мужчина

Отправлено 07 Май 2019 - 13:27

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

#9 Ivanco

    Дилер

  • Дилеры
  • PipPipPipPip
  • 346 сообщений
  • Пол:Мужчина
  • Город:Красноярск
  • Интересы:САПР

Отправлено 07 Май 2019 - 13:34

Просмотр сообщенияLion007 (07 Май 2019 - 13:27) писал:

остается раскладывать линии (тем более, если они все равно нужны по отдельности) и тупо обрезать их сегментами полилинии.
вот это я и не могу геометрически/алгоритмически собразить)
"ИнфоИндастри" г.Красноярск,г.Иркутск,г.Владивосток-официальный дилер Нанософт
YouTube,GitHub - Ivanco21, using:C#/MultiCAD.NET

#10 Lion007

    Разработчик nanoCAD

  • Клуб разработчиков
  • PipPipPipPip
  • 512 сообщений
  • Пол:Мужчина

Отправлено 07 Май 2019 - 14:00

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

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

#11 Robink

    Активист

  • Пользователи
  • PipPipPipPip
  • 412 сообщений
  • Пол:Мужчина
  • Город:Казань
  • Интересы:САПРостроение

Отправлено 07 Май 2019 - 14:15

Просмотр сообщенияLion007 (07 Май 2019 - 14:00) писал:

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

есть тонкий момент : линия может *касаться* полилинии - например в вершине (или касаться дугового сегмента). в этом случае точка пересечения получится одна.
если она была первая - то она сломает "попарность". а если мы таким образом попадем в 2 вершины - то получим лишний ненужный отрезок. а если у нас линия совпадает с сегментом... в общем, тут надо аккуратно! :)
из незатейливых тестов - можно проверить серединки получившихся отрезочков на попадание внутрь полилинии - тогда будет понятно, какие нам нужны, а какие нет
http://developer.nan...47#message-1647
Ага уже плавали :)

#12 doctorraz

    Посетитель

  • Пользователи
  • PipPipPipPip
  • 1 203 сообщений
  • Пол:Мужчина
  • Город:Волгоград
  • Интересы:всё понемногу

Отправлено 07 Май 2019 - 14:16

Просмотр сообщенияIvanco (07 Май 2019 - 13:34) писал:

Просмотр сообщенияLion007 (07 Май 2019 - 13:27) писал:

остается раскладывать линии (тем более, если они все равно нужны по отдельности) и тупо обрезать их сегментами полилинии.
вот это я и не могу геометрически/алгоритмически собразить)
возможно поможет
_algolist.manual.ru/maths/geom/
_www.cad.dp.ua/stats/a_vba/
_www.cyberforum.ru/geometry/
сам недавно решал схожую задачу, пересечения двух окружностей построения к ним касательных.. получилось))
----------------------
недопиленная аналитика((
Скрытый текст


#13 Ivanco

    Дилер

  • Дилеры
  • PipPipPipPip
  • 346 сообщений
  • Пол:Мужчина
  • Город:Красноярск
  • Интересы:САПР

Отправлено 13 Май 2019 - 17:09

вообщем решено было сперва пойти по простому пути и делать 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();
				}

"ИнфоИндастри" г.Красноярск,г.Иркутск,г.Владивосток-официальный дилер Нанософт
YouTube,GitHub - Ivanco21, using:C#/MultiCAD.NET

#14 Ivanco

    Дилер

  • Дилеры
  • PipPipPipPip
  • 346 сообщений
  • Пол:Мужчина
  • Город:Красноярск
  • Интересы:САПР

Отправлено 17 Май 2019 - 10:45

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

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

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

как приводить объекты с одних типов к другим в данном случае?
К примеру из :
Teigha.DatabaseServices.Dbline ------->>
Multicad.DatabaseServices.StandardObjects.DbLine;
или обратно.
"ИнфоИндастри" г.Красноярск,г.Иркутск,г.Владивосток-официальный дилер Нанософт
YouTube,GitHub - Ivanco21, using:C#/MultiCAD.NET

#15 Robink

    Активист

  • Пользователи
  • PipPipPipPip
  • 412 сообщений
  • Пол:Мужчина
  • Город:Казань
  • Интересы:САПРостроение

Отправлено 17 Май 2019 - 12:43

Просмотр сообщенияIvanco (17 Май 2019 - 10:45) писал:

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

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);





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей