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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Знатоки Lisp, помогите найти середину сегмента сплайна.

Знатоки Lisp, помогите найти середину сегмента сплайна.

Ответ
Поиск в этой теме
Непрочитано 27.11.2018, 02:40
Знатоки Lisp, помогите найти середину сегмента сплайна.
iskatel111
 
Регистрация: 13.06.2012
Сообщений: 98

vba не позволяет найти произвольную точку на сплайне, хотя встречал инфу что на лиспе это возможно. Даже пример кода там был, но я в лиспе совсем не понимаю. Темболее задача у меня другая:

Есть несколько определенных точек (см. ниже) через которые проведен сплайн (фитпоинты). Но также добавлены фитпоинты "просто от балды" чтоб сплайн в красивый вид привести.
Мне же нужно по центру получившегося безобразия (сегментов между двумя определенными точками, не взирая на дополнительные) нарисовать стрелочку. Т.е мне нужно найти точку, равоудаленную по сплайну от определенных фитпоинтов, и вектор для стрелки (ну или пару точек на миллиметр отстоящих, всеж это для картинки, даже сотки ловить не надо, главное чтоб стрелка началом и концом лежала на сплайне)

{ниже это сюда}
точки на чертеже вобщемто не точки, а некоторая несуразность в виде штриховки (как маленький круг) и надписи Мтекст рядом. думаю пробежаться и вручную преобразовать это в блоки, с точкой вставки в центре "круга". задача - получить эту самую точку, по которой ориентироваться. Ориентироваться и привязками, и программно находить имя по тексту, и по координатам находить имя (может кто подскажет как лучше). Если тупо сравнивать координаты - прокатит? не подложит свинью точность double?

Другая задача, что я на vba (ну не совсем vba, шарп через interop, но все что мне доступно - тоже что и в vba) могу лисп вызывать через SendCommand, но данные как лучше передавать? встраивать в строку комманды, или сохранить гдето в чертеже? ну собственно как результат получать потом?

ЗЫ второй вариант - пересчитать сплайн в своей программе, но гугл мне штук шесть вариантов сплайна показал, без конкретных формул, и хз какая в акаде используется. Если кто знает киньте плиз конкретной формулой.
Просмотров: 6723
 
Автор темы   Непрочитано 13.12.2018, 13:52
#21
iskatel111


 
Регистрация: 13.06.2012
Сообщений: 98


Цитата:
Сообщение от trir Посмотреть сообщение
как то так:
код выглядит логично, но выдает какую-то фигню
Во вложении примеры: точки начала и конца - те что лежат на зеленой линии, окружность с центром в точке res


Что я делаю не так?

ЗЫ. сплайн против часовой

ЗЫЫ. наконецто добрался до API, оказывается не сложно.
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot_8.png
Просмотров: 20
Размер:	44.7 Кб
ID:	209035  Нажмите на изображение для увеличения
Название: Screenshot_9.png
Просмотров: 21
Размер:	43.4 Кб
ID:	209036  
iskatel111 вне форума  
 
Непрочитано 13.12.2018, 14:02
#22
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


выложи проект
trir вне форума  
 
Автор темы   Непрочитано 13.12.2018, 14:14
#23
iskatel111


 
Регистрация: 13.06.2012
Сообщений: 98


Цитата:
Сообщение от trir Посмотреть сообщение
выложи проект
Небольшой косяк нашел - номера точек я смотрел в автокаде в свойствах, а они там с единицы, так что по факту вычислялось от точек на зеленой линии +1. Но сути не меняет - полученная точка даже не лежит на сплайне

Проект то не проект - копипаста с хабра:

Код:
[Выделить все]
 public void test()
        {
            Database db = HostApplicationServices.WorkingDatabase;

            // начинаем транзакцию
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                // получаем ссылку на пространство модели (ModelSpace)
                BlockTableRecord ms = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);

                // "пробегаем" по всем объектам в пространстве модели
                foreach (ObjectId id in ms)
                {
                    // приводим каждый из них к типу Entity
                    Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead);

        

                    if (entity.GetType() == typeof(Spline))
                    {
                        Spline spl = (Spline)entity;

                        double sdist = spl.GetDistAtPoint(spl.GetFitPointAt(9));

                        double edist = spl.GetDistAtPoint(spl.GetFitPointAt(11));

                        var res = spl.GetPointAtDist((sdist + edist) / 2);

                        //Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("\nLayer:{0}; Type:{1}; Color: {2},{3},{4}\n",
                        //   entity.Layer, entity.GetType().ToString(), entity.Color.Red.ToString(), entity.Color.Green.ToString(), entity.Color.Blue.ToString()));

                    }
                }

                tr.Commit();
            }
        }
сплайн находит, все норм. (окружности я сам рисовал по координатам из отладчика)

----- добавлено через ~7 мин. -----
Сорри, сам дурак, все нормально работает. там сотые миллиметра сильно влияют, я округлил, окружность и уползла
iskatel111 вне форума  
 
Непрочитано 13.12.2018, 14:36
#24
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


сравни количество чисел после запятой в отладчике и у окружности
trir вне форума  
 
Непрочитано 13.12.2018, 14:36
#25
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Если середину сплайна ищете, то откуда 9, 11 значения?

Код:
[Выделить все]
// AutoCAD
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;

namespace Сплайн_тест
{
    public class CommandsClass
    {
        [CommandMethod("GetMiddleSPline")]
        public void GetMiddleSPline()
        {
            // Получаем текущий документ, его БД и редактор
            Document lAcadDoc = Application.DocumentManager.MdiActiveDocument;
            Database lAcadDb = lAcadDoc.Database;
            Editor lAcadEd = lAcadDoc.Editor;
            // Запрашиваем сплайн
            PromptEntityResult lPromptEntityResult = lAcadEd.GetEntity("\nВыберите сплайн:");
            if (lPromptEntityResult.Status == PromptStatus.OK)
            {
                using (Transaction lAcadTr = lAcadDb.TransactionManager.StartTransaction())
                {
                    // Получаем объект из БД
                    DBObject lDBObject = lAcadTr.GetObject(lPromptEntityResult.ObjectId, OpenMode.ForRead);
                    // Пробуем привести к сплайну
                    Spline lSpline = lDBObject as Spline;
                    // Если успешно
                    if (lSpline != null)
                    {
                        Point3d lMiddlePoint = lSpline.GetPointAtDist(
                            (lSpline.GetDistanceAtParameter(lSpline.EndParam) - lSpline.GetDistanceAtParameter(lSpline.StartParam)) / 2);
                    }
                     lAcadTr.Commit();
                }
            }

        }

    }
}

Последний раз редактировалось Сергей812, 13.12.2018 в 22:40. Причина: Позор мне, Commit забыл)
Сергей812 вне форума  
 
Непрочитано 13.12.2018, 14:38
#26
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
Если середину сплайна ищете
середина между FitPoint
trir вне форума  
 
Непрочитано 13.12.2018, 14:42
#27
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


а, сорри, недоглядел)
Сергей812 вне форума  
 
Непрочитано 13.12.2018, 15:07
#28
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


Цитата:
рисовал по координатам из отладчика
Код:
[Выделить все]
                        Point3d res = spl.GetPointAtDist((sdist + edist) / 2);
                        Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
                        ed.WriteMessage($" X:{res.X} Y:{res.Y} Z:{res.Z} \n");
trir вне форума  
 
Непрочитано 13.12.2018, 19:09
#29
Кулик Алексей aka kpblc
Moderator

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


Круто, и снова в lisp участвует код C#
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.12.2018, 19:41
#30
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Круто, и снова в lisp участвует код C#
Не совсем так, автор пишет на С#... а лисп спрашивал от незнания... =о)

Цитата:
Сообщение от iskatel111 Посмотреть сообщение
Проект то не проект - копипаста с хабра:
......
Простите, но это плохой код, просто плохой, там много лишнего. я еще только учусь, но я бы написал так:
Код:
[Выделить все]
         public void test()
        {
            Db.Database db = Db.HostApplicationServices.WorkingDatabase;
            // получаем рабочее пространство модели или листа
            using (Db.BlockTableRecord ms = db.CurrentSpaceId.Open(Db.OpenMode.ForRead) as Db.BlockTableRecord)
            {
                foreach (Db.ObjectId id in ms)
                {
                    if (id.ObjectClass.IsDerivedFrom(Rtm.RXClass.GetClass(typeof(Db.Spline))))
                    {
                        using (Db.Spline spl = id.Open(Db.OpenMode.ForRead) as Db.Spline)
                        {
                            double sdist = spl.GetDistAtPoint(spl.GetFitPointAt(9));
                            double edist = spl.GetDistAtPoint(spl.GetFitPointAt(11));
                            Point3d res = spl.GetPointAtDist((sdist + edist) / 2);
                        }
                    }
                }
            }
        }
Boxa вне форума  
 
Непрочитано 13.12.2018, 22:35
#31
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Offtop:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Круто, и снова в lisp участвует код C#
так можно уже переносить ветку
Цитата:
Сообщение от iskatel111 Посмотреть сообщение
наконецто добрался до API, оказывается не сложно.


----- добавлено через ~14 мин. -----
И Аутодеск рекомендует использовать транзакции всетаки:
Цитата:
If you need to work with a single object, using the Open and Close methods can reduce the number of lines of code that you might otherwise have to write compared to working with the Transaction Manager. However, using transactions is the recommended way of opening and closing objects.
перевод:
Цитата:
Если требуется работать с одним объектом, использование методов Open и Close может уменьшить количество строк кода, которые в противном случае пришлось бы писать, по сравнению с работой с диспетчером транзакций. Однако рекомендуется использовать транзакции для открытия и закрытия объектов.
Сергей812 вне форума  
 
Непрочитано 14.12.2018, 08:05
#32
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Сергей812, именно, что рекомендует. Авто производители также много чего рекомендуют... ну что бы не заморачиваться, делайте так и будет норм, а если на второй, третьей, пятой вложенной транзакции вылетит фатал, то там раздеретесь...
Я не против транзакций, но пройдясь по граблям и фаталам, желания совать транзакцию куда не попадя пропало напрочь. Транзакция - инструмент и его надо использовать только там где уместно и аккуратно, с умом и пониманием.
В данном случае, метод ничего не меняет в базе чертежа, просто читает некоторые данные, в случае внезапного прекращения работы данного кода ничего в базе не изменится, откатывать изменения назад не нужно, соответственно и транзакция не сильно то и нужна, а если можно обойтись без нее, то зачем плодить сущности...
Boxa вне форума  
 
Непрочитано 14.12.2018, 13:02
#33
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,004


Цитата:
Сообщение от Boxa Посмотреть сообщение
а если на второй, третьей, пятой вложенной транзакции вылетит фатал, то там раздеретесь.
а зачем 3-5 уровень вложенности транзакции?
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Знатоки Lisp, помогите найти середину сегмента сплайна.

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти прогоны длиной 6000мм, сечением 180х600мм Toxel Поиск литературы, чертежей, моделей и прочих материалов 3 22.01.2011 07:28
Помогите найти СП 31-115-2008 Открытые физкультурно-спортивные сооружения. Часть 4. Экстремальные виды спорта Aragorn Поиск литературы, чертежей, моделей и прочих материалов 2 02.12.2010 06:58
СНиП 11-10-75. Технология укладки асфальтовой смеси. Помогите найти! Maxim-t Поиск литературы, чертежей, моделей и прочих материалов 5 23.09.2010 00:11
Помогите найти описание функций lisp'a - vlisp-* Кулик Алексей aka kpblc Поиск литературы, чертежей, моделей и прочих материалов 4 30.06.2010 16:45
Помогите найти чертежи православных храмов leonbka Поиск литературы, чертежей, моделей и прочих материалов 5 12.03.2010 11:31