Ivanco 124 Жалоба Опубликовано 7 мая Всем привет. Задача такая: есть плоская полилиния произвольной сложности. Ее нужно "заштриховать" отрезками с указанным юзером интервалом и углом от XY. Чето я алгоритмически не могу сообразить, как это сделать?) Вероятно, для простоты надо "заштриховать" некий limiting box вокруг полилинии, а потом как то обрезать не нужное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Lion007 331 Жалоба Опубликовано 7 мая например - проофсетить в обе стороны, замкнуть торцы и позвать обычный хэтч 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Kreator 411 Жалоба Опубликовано 7 мая Что-то мне другая картина рисовалась А можно результат показать задумки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Robink 69 Жалоба Опубликовано 7 мая (изменено) А я бы пошел по пути постройки отрезков и поиска их точек пересечения с полилинией. В MC есть функции для поиска пересечений и определения внутри ли контура точка, но вот последняя глючила, скорее всего исправили (я давал заявку). Изменено 7 мая пользователем Robink Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Ivanco 124 Жалоба Опубликовано 7 мая (изменено) Результат приложил. Поллиния обязательно закрытая - это проверяется на входе в скрипт. Штриховка не подходит (вроде как), т.к. я не могу задать отступ начальный от некого "края"(к примеру самой "левого"). Изменено 7 мая пользователем Ivanco Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Lion007 331 Жалоба Опубликовано 7 мая на самом деле в штриховке можно задать базовую точку паттерна. программно. по крайней мере на уровне OdDbHatch. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Ivanco 124 Жалоба Опубликовано 7 мая на самом деле в штриховке можно задать базовую точку паттерна. программно. по крайней мере на уровне OdDbHatch. вообщем если штриховкой делать, нужны возможности: - выставить базовую точку внутри основного контура программно - программно задать расстояния между штрихами (я так понямаю это в .PAT где то прописано и множиться на масштаб ? как это считать с .pat? или использовать свой .pat?) - угол задать программно (начальный опять же вероятно в .pat записан, его надо считать или как..) - потом штриховку разбить (это вроде не проблема) - получить в итоге набор отрезков , программно в виде массива. Вроде задача выглядит решаемой , если все что выше можно сделать в API на .NET Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Lion007 331 Жалоба Опубликовано 7 мая увы... на дотнете нету нужных дырок. остается раскладывать линии (тем более, если они все равно нужны по отдельности) и тупо обрезать их сегментами полилинии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Ivanco 124 Жалоба Опубликовано 7 мая остается раскладывать линии (тем более, если они все равно нужны по отдельности) и тупо обрезать их сегментами полилинии. вот это я и не могу геометрически/алгоритмически собразить) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Lion007 331 Жалоба Опубликовано 7 мая нууу... тут разные варианты возможны. например так : - считаем баунд полилинии - в рамках этого баунда (начиная от пресловутой базовой точки) создаем пачку линий. можно обычных отрезков, можно XLINE - разница невелика - дальше последовательно для каждой такой линии --- считаем пересечения с полилайном (IntersectWith - есть такой метод, выдает набор точек пересечения) --- сортируем эти точки по направлению линии --- попарно создаем отрезочки (выходные) есть тонкий момент : линия может *касаться* полилинии - например в вершине (или касаться дугового сегмента). в этом случае точка пересечения получится одна. если она была первая - то она сломает "попарность". а если мы таким образом попадем в 2 вершины - то получим лишний ненужный отрезок. а если у нас линия совпадает с сегментом... в общем, тут надо аккуратно! из незатейливых тестов - можно проверить серединки получившихся отрезочков на попадание внутрь полилинии - тогда будет понятно, какие нам нужны, а какие нет 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Robink 69 Жалоба Опубликовано 7 мая нууу... тут разные варианты возможны. например так : - считаем баунд полилинии - в рамках этого баунда (начиная от пресловутой базовой точки) создаем пачку линий. можно обычных отрезков, можно XLINE - разница невелика - дальше последовательно для каждой такой линии --- считаем пересечения с полилайном (IntersectWith - есть такой метод, выдает набор точек пересечения) --- сортируем эти точки по направлению линии --- попарно создаем отрезочки (выходные) есть тонкий момент : линия может *касаться* полилинии - например в вершине (или касаться дугового сегмента). в этом случае точка пересечения получится одна. если она была первая - то она сломает "попарность". а если мы таким образом попадем в 2 вершины - то получим лишний ненужный отрезок. а если у нас линия совпадает с сегментом... в общем, тут надо аккуратно! из незатейливых тестов - можно проверить серединки получившихся отрезочков на попадание внутрь полилинии - тогда будет понятно, какие нам нужны, а какие нет http://developer.nanocad.ru/redmine/boards/3/topics/1311?r=1647#message-1647 Ага уже плавали Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
doctorraz 852 Жалоба Опубликовано 7 мая остается раскладывать линии (тем более, если они все равно нужны по отдельности) и тупо обрезать их сегментами полилинии. вот это я и не могу геометрически/алгоритмически собразить) возможно поможет _algolist.manual.ru/maths/geom/ _www.cad.dp.ua/stats/a_vba/ _www.cyberforum.ru/geometry/ сам недавно решал схожую задачу, пересечения двух окружностей построения к ним касательных.. получилось)) ---------------------- недопиленная аналитика(( http://www.youtube.com/watch?v=4bcdc7ROtyA&feature=youtu.be 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Ivanco 124 Жалоба Опубликовано 13 мая вообщем решено было сперва пойти по простому пути и делать 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(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Ivanco 124 Жалоба Опубликовано 17 мая диалог с самим собой), в "клуб разработчиков" впрочем тоже не отвечают конечно. Еще пара вопросов: 1. нормально ли использовать чистый .NET API и MultiCAD.NET ? в том плане , что это вообще нормальная практика "смешивать" разные API в разработке. 2. ну ладно я нашел Explode() в "чистом" .NET nanoCAD API и оно работает). но мне нужно кой чего из Multicad. как приводить объекты с одних типов к другим в данном случае? К примеру из : Teigha.DatabaseServices.Dbline ------->> Multicad.DatabaseServices.StandardObjects.DbLine; или обратно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Robink 69 Жалоба Опубликовано 17 мая диалог с самим собой), в "клуб разработчиков" впрочем тоже не отвечают конечно. Еще пара вопросов: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты