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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить координаты ручек в дин. блоках?

Как получить координаты ручек в дин. блоках?

Ответ
Поиск в этой теме
Непрочитано 03.03.2017, 19:02
Как получить координаты ручек в дин. блоках?
power85
 
Регистрация: 03.02.2017
Сообщений: 56

Здравствуйте, эксперты.
Как получить координаты ручек в динамических блоках которые уже вставлены в чертеж?
Есть идеи?
Просмотров: 7783
 
Непрочитано 09.03.2017, 17:40
#21
Boxa

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


Спасибо за интересную задачку. Разобрался как это работает, было интересно.
Код:
[Выделить все]
Command: (GetGripPoints (setq obj (car (entsel))) 0)
Select object: ((28246.0 20818.0 0.0))
Command: (GetGripPoints (setq obj (car (entsel))) 1)
Select object: ((37596.0 27148.0 0.0))
Command: (GetGripPoints (setq obj (car (entsel))) 3)
Select object: (nil)
Command: _circle
Specify center point for circle or [3P/2P/Ttr (tan tan radius)]:
Specify radius of circle or [Diameter]:
Command: (GetGripPoints (setq obj (car (entsel))) 0)
Select object: ((31303.0 33121.0 0.0))


----- добавлено через 47 сек. -----
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Через GetGripPoints нельзя получить ручки динамического блока.
Можно получить координаты ручек.
По крайней мере у меня работает
Boxa вне форума  
 
Непрочитано 09.03.2017, 17:50
#22
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Boxa Посмотреть сообщение
Можно получить координаты ручек.
По крайней мере у меня работает
Я не правильно выразил свою мысль. В любом случае подвигать их при помощи MoveGripPointsAt не получится: https://forums.autodesk.com/t5/net/s...s/td-p/3738311
Александр Ривилис вне форума  
 
Непрочитано 09.03.2017, 18:48
#23
Сергей812


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


Цитата:
Сообщение от power85 Посмотреть сообщение
Только скажите для каждой версии автокад нужен свой файл скомпилированный в NET?
Ну если пишите общий код без залезания в дебри типа импорта функций - то по идее должно быть 2009, 2010-2012, 2013-2014, 2015-2016, 2017 и под соответствующую разрядность. Во всяком случае, такая градация у Александра Ривилиса в его знаменитейшей утилите ExplodeProxy, написанной на ObjectARX.
Сергей812 вне форума  
 
Непрочитано 09.03.2017, 22:03
#24
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Ну если пишите общий код без залезания в дебри типа импорта функций - то по идее должно быть 2009, 2010-2012, 2013-2014, 2015-2016, 2017 и под соответствующую разрядность. Во всяком случае, такая градация у Александра Ривилиса в его знаменитейшей утилите ExplodeProxy, написанной на ObjectARX.
Это для ObjectARX. Для .NET можно обойтись и меньшим количеством.
Александр Ривилис вне форума  
 
Непрочитано 09.03.2017, 22:22
#25
Сергей812


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Это для ObjectARX. Для .NET можно обойтись и меньшим количеством
разве не по версиям программного кода идет деление?
2010-2012 - версия 18.x
2013-2014 - версия 19.x
2015-2016 - версия 20.х
2017 - версия 21.x
Сергей812 вне форума  
 
Непрочитано 09.03.2017, 22:25
#26
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
разве не по версиям программного кода идет деление?
Нет. Теоретически можно на .NET сделать одну dll для 2007...2012 и вторую для 2013 и до 2017. Но не всегда.
Александр Ривилис вне форума  
 
Непрочитано 09.03.2017, 22:37
#27
Сергей812


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Нет. Теоретически можно на .NET сделать одну dll для 2007...2012 и вторую для 2013 и до 2017. Но не всегда.
Если писать библиотеку под самый младший NET фреймворк (который гарантированно присутствует при установленном акаде соответствующих версий) и использовать только не изменяющиеся во времени по вызовам и аргументам функции и типы данных?
Сергей812 вне форума  
 
Непрочитано 09.03.2017, 23:20
1 | #28
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если писать библиотеку под самый младший NET фреймворк (который гарантированно присутствует при установленном акаде соответствующих версий) и использовать только не изменяющиеся во времени по вызовам и аргументам функции и типы данных?
Да.
Александр Ривилис вне форума  
 
Непрочитано 09.03.2017, 23:41
#29
Сергей812


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


и отдельно под х64 и x32 соответственно.
Сергей812 вне форума  
 
Непрочитано 10.03.2017, 00:39
#30
Кулик Алексей aka kpblc
Moderator

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



.NET? По-моему, необязательно (хотя, конечно, многое зависит от внутренностей dll)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 10.03.2017, 01:01
#31
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,405
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
и отдельно под х64 и x32 соответственно.
Необязательно если не используешь зависящие от разрядности библиотеки. Например, если используешь только AutoCAD .NET API, то от разрядности не зависит, а если используешь AutoCAD COM/ActiveX, то зависит.
Александр Ривилис вне форума  
 
Непрочитано 10.03.2017, 02:51
#32
Сергей812


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Необязательно если не используешь зависящие от разрядности библиотеки. Например, если используешь только AutoCAD .NET API, то от разрядности не зависит, а если используешь AutoCAD COM/ActiveX, то зависит.
Спасибо, забыл уже) Сталкивался с этим, когда только учился программировать в сборке через Interop - в офисе были еще старые х32 машины и приходилось под них компилировать отдельные сборки. А если чистый Net API и при параметрах компиляции AnyCPU - наборы инструкций MSIL при преобразовании в машинный код будут нужной разрядности.
Сергей812 вне форума  
 
Непрочитано 10.03.2017, 05:40
#33
Boxa

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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
В любом случае подвигать их при помощи MoveGripPointsAt не получится: https://forums.autodesk.com/t5/net/s...s/td-p/3738311
не согласен, вот иллюстрирующий ролик https://youtu.be/65IQxmCe1ow


зы.
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Нет. Теоретически можно на .NET сделать одну dll для 2007...2012 и вторую для 2013 и до 2017. Но не всегда.
собрал сборку с настройками под 2014 акад проверил, работает и ее же запустил на 2017, так же работает.

Последний раз редактировалось Boxa, 10.03.2017 в 09:53. Причина: добавил уточняющую картинку
Boxa вне форума  
 
Автор темы   Непрочитано 10.03.2017, 10:37
#34
power85


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
собрал сборку с настройками под 2014 акад проверил, работает и ее же запустил на 2017, так же работает.
Отлично. Можете дать ссылку на dll и на исходник? Буду очень признателен. Я работаю в данный момент в 2012 x32 и 2017 х64.
Интересует функция для lisp - MoveGripPointsAt и GetGripPoints, еще прошу описать аргументы для функций.
Исходник я прошу чтобы если что не тревожить вас. Заранее спасибо.
power85 вне форума  
 
Непрочитано 10.03.2017, 11:02
#35
Boxa

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


Цитата:
Сообщение от power85 Посмотреть сообщение
Отлично. Можете дать ссылку на dll и на исходник? Буду очень признателен. Я работаю в данный момент в 2012 x32 и 2017 х64.
Интересует функция для lisp - MoveGripPointsAt и GetGripPoints, еще прошу описать аргументы для функций.
Честно говоря есть только наброски кода для проверки идеи... к тому же, именно лисп функцию, я попробовал написать только для GetGripPoints, сеттер же, выполнен просто как команда с прописанными значениями.

Цитата:
Сообщение от power85 Посмотреть сообщение
Исходник я прошу чтобы если что не тревожить вас.
Мне не жалко, но Вы ведь не знаете С#, какой Вам от них толк?
Boxa вне форума  
 
Автор темы   Непрочитано 10.03.2017, 11:13
#36
power85


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Мне не жалко, но Вы ведь не знаете С#, какой Вам от них толк?
Я думал что у вас все работает. Хотя и не знаю но думаю что разберусь он же проще C++.
power85 вне форума  
 
Непрочитано 10.03.2017, 11:25
#37
Boxa

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


Еще раз, это просто набросок для проверки идеи, тут много чего не хватает и следует переделать, так что на свой страх и риск
Из приведенного кода сигнатура GetGripPoints думаю понятна, первый аргумент - objectId , второй - индекс ручки, возвращает точку.
Код:
[Выделить все]
     public class Commands
    {
        [Rtm.CommandMethod("SetGripPoints")]
        public static void SetGripPoints()
        {
            App.Document acDoc = cad.DocumentManager.MdiActiveDocument;
            Db.Database acCurDb = acDoc.Database;
            Ed.Editor acEd = acDoc.Editor;

            Ed.PromptEntityOptions optEnt = new Ed.PromptEntityOptions("\nВыбери объект:");
            optEnt.AllowNone = false;
            Ed.PromptEntityResult resEnt = acEd.GetEntity(optEnt);
            if (resEnt.Status != Ed.PromptStatus.OK)
                return;

            using (Db.Transaction acTrans = acCurDb.TransactionManager.StartOpenCloseTransaction())
            {
                Db.Entity ent = acTrans.GetObject(resEnt.ObjectId, Db.OpenMode.ForWrite) as Db.Entity;
                Db.GripDataCollection grips = new Db.GripDataCollection();
                double curViewUnitSize = 0;
                int gripSize = 0;
                Gem.Vector3d curViewDir = acDoc.Editor.GetCurrentView().ViewDirection;

                Db.GetGripPointsFlags bitFlags = Db.GetGripPointsFlags.GripPointsOnly;
                ent.GetGripPoints(grips, curViewUnitSize, gripSize, curViewDir, bitFlags);

                Db.MoveGripPointsFlags bitFlagsMove = Db.MoveGripPointsFlags.Polar;
                ent.MoveGripPointsAt(grips, new Gem.Vector3d(100, 100, 0), bitFlagsMove);

                acTrans.Commit();
            }
        }

        //(GetGripPoints (setq obj (car (entsel))) 0)
        [Rtm.LispFunction("GetGripPoints")]
        public static Db.ResultBuffer GetGripPoints(Db.ResultBuffer rbArgs)
        {
            Db.ResultBuffer rbfResult;
            rbfResult = new Db.ResultBuffer(new Db.TypedValue((int)Rtm.LispDataType.Nil));

            if (rbArgs != null)
            {
                Db.ObjectId idVal1 = Db.ObjectId.Null;
                int intVal2 = 0;
                int nCnt = 0;
                foreach (Db.TypedValue rb in rbArgs)
                {
                    //Тут получаем объект
                    if (rb.TypeCode == (int)Rtm.LispDataType.ObjectId && nCnt == 0)
                        idVal1 = (Db.ObjectId)rb.Value == Db.ObjectId.Null ? Db.ObjectId.Null : (Db.ObjectId)rb.Value;

                    //Тут читаем ручку с индексом 
                    if (rb.TypeCode == (int)Rtm.LispDataType.Int16 && nCnt == 1)
                        intVal2 = int.Parse(rb.Value.ToString());

                    nCnt++;
                }

                if (!idVal1.IsNull && idVal1.IsValid && idVal1.IsResident && !idVal1.IsErased && intVal2 >= 0 )
                {
                    Gem.Point3d? p1 = GetGrip(idVal1, intVal2);
                    if (p1 != null)
                        rbfResult = new Db.ResultBuffer(new Db.TypedValue((int)Rtm.LispDataType.Point3d, (Gem.Point3d)p1));
                }
            }
            return rbfResult;
        }

        static private Gem.Point3d? GetGrip(Db.ObjectId id, int gripIndex)
        {
            App.Document acDoc = cad.DocumentManager.MdiActiveDocument;
            Gem.Point3d? p1 = null;
            if (id.ObjectClass.IsDerivedFrom(Rtm.RXClass.GetClass(typeof(Db.Entity))))
            {
                using (Db.Transaction acTrans = acDoc.Database.TransactionManager.StartOpenCloseTransaction())
                {
                    Db.Entity ent = acTrans.GetObject(id, Db.OpenMode.ForRead) as Db.Entity;
                    Db.GripDataCollection grips = new Db.GripDataCollection();
                    double curViewUnitSize = 0;
                    int gripSize = 0;
                    Gem.Vector3d curViewDir = acDoc.Editor.GetCurrentView().ViewDirection;
                    Db.GetGripPointsFlags bitFlags = Db.GetGripPointsFlags.GripPointsOnly;
                    ent.GetGripPoints(grips, curViewUnitSize, gripSize, curViewDir, bitFlags);
                    if (gripIndex < grips.Count)
                    {
                        p1 = new Gem.Point3d(grips[gripIndex].GripPoint.X,
                                            grips[gripIndex].GripPoint.Y,
                                            grips[gripIndex].GripPoint.Z);
                    }
                    acTrans.Commit();
                }
            }
            return p1;
        }
    }
Boxa вне форума  
 
Автор темы   Непрочитано 10.03.2017, 11:47
#38
power85


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


Ясно. Спасибо.
power85 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить координаты ручек в дин. блоках?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp. Получить координаты точек 3D тела. Golem-iq LISP 9 06.09.2013 13:38
Как получить координаты прямоугольника, в который вписаны все видимые объекты чертежа swkx Программирование 2 31.07.2013 17:42
Быстро получить Набор объектов попадающих в Сферу [N.S] Программирование 10 09.08.2009 11:04
Как получить координаты точек отображенных на четеже в виде таблици?? nix-- AutoCAD 10 22.05.2009 13:41
Координаты области выделения Тим Боль Программирование 6 04.11.2007 16:52