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

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

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

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

Здравствуйте, эксперты.
Как получить координаты ручек в динамических блоках которые уже вставлены в чертеж?
Есть идеи?
Просмотров: 8090
 
Непрочитано 03.03.2017, 22:44
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Не могу не спросить. А зачем они Вам?
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 04.03.2017, 12:13
#3
power85


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


Чтобы блок воздуховода изменять программно, непосредствено его концы.
power85 вне форума  
 
Непрочитано 04.03.2017, 12:38
| 2 #4
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Для этого есть значения динамических параметров блока, которые можно получать и задавать программно. Ручки - это для пользователей. Тем более, что с помощью LISP с ними вообще ничего не сделать, насколько я помню.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 05.03.2017, 17:47
#5
power85


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Для этого есть значения динамических параметров блока, которые можно получать и задавать программно. Ручки - это для пользователей. Тем более, что с помощью LISP с ними вообще ничего не сделать, насколько я помню
А из параметра (дин. блока) vba объекта можно координаты получить (изменить)?
power85 вне форума  
 
Непрочитано 05.03.2017, 17:50
#6
Кулик Алексей aka kpblc
Moderator

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


Наверное, не из параметра, а из указателя на вхождение блока. Если так, то да, можно - был бы блок динамический.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.03.2017, 17:53
#7
power85


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Наверное, не из параметра, а из указателя на вхождение блока. Если так, то да, можно - был бы блок динамический.
Поподробнее что такое указатель на вхождение блока?
power85 вне форума  
 
Непрочитано 05.03.2017, 23:26
#8
Кулик Алексей aka kpblc
Moderator

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


Ыыыы... http://autolisp.ru/2017/02/18/blockdef-and-blockref/ ?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.03.2017, 11:54
#9
power85


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ясно.

Похоже как я понимаю по ответам это не возможно?
Что же придется как то вычислять по углу поворота блока, по параметрам длин, по методу GetBoundingBox (координаты крайних точек блока).
power85 вне форума  
 
Непрочитано 09.03.2017, 12:11
#10
Кулик Алексей aka kpblc
Moderator

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


1. Получить указатель на вхождение блока
2. Получить коллекцию динамических параметров вхождения (или сразу нужный параметр отфильтровать - это уже дело вкуса)
3. Установить новое значение нужного параметра
4. Обновить вхождение блока.

В чем проблема-то?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.03.2017, 12:19
#11
power85


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
1. Получить указатель на вхождение блока
2. Получить коллекцию динамических параметров вхождения (или сразу нужный параметр отфильтровать - это уже дело вкуса)
3. Установить новое значение нужного параметра
4. Обновить вхождение блока.

В чем проблема-то?
Спасибо за ответ. Проблема что ты не меняешь координаты ручек сразу, а меняешь эти координаты косвенно через параметры блока.
Чтобы изменить координаты ручек надо менять параметры. Верно?
power85 вне форума  
 
Непрочитано 09.03.2017, 12:38
#12
Boxa

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


у BlockReference есть метод GetGripPoints(grips As GripDataCollection, curViewUnitSize As Double, gripSize As Integer, curViewDir As Vector3d, bitFlags As GetGripPointsFlags) As Boolean
работает это как то так:
Код:
[Выделить все]
Dim acBlock As BlockReference = CType(acEnt, BlockReference)
Dim grips As GripDataCollection = New GripDataCollection()
Dim curViewUnitSize As Double = 0
Dim gripSize As Integer = 0
Dim curViewDir As Vector3d = acDoc.Editor.GetCurrentView().ViewDirection
Dim bitFlags As GetGripPointsFlags = GetGripPointsFlags.GripPointsOnly

acBlock.GetGripPoints(grips, curViewUnitSize, gripSize, curViewDir, bitFlags)

For Each grip As GripData In grips
	Dim p1 As Point3d = New Point3d(grip.GripPoint.X, grip.GripPoint.Y, grip.GripPoint.Z)
Next

Правда это в рамках .net , как на других платформах, не знаю.

правда наверное лучше все же использовать параметры + матрицу трансформаций блока для вычисления положения и размера блока в модели.
Boxa вне форума  
 
Непрочитано 09.03.2017, 12:39
#13
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,174


Цитата:
Сообщение от power85 Посмотреть сообщение
Чтобы блок воздуховода изменять программно, непосредствено его концы.
Цитата:
Сообщение от power85 Посмотреть сообщение
Чтобы изменить координаты ручек надо менять параметры. Верно?
Судя по прежним высказываниям, в конечном счете Вам надо изменить графику блока, чтобы его "непосредствено его концы" оказались в нужных местах. Для этого надо изменить параметры блока.
"Ручки" - это уже вторично, но т.к. нормально настроенные параметры воздействуют как на графику, так и на "ручки", то при изменении параметров ручки тоже передвинутся, вместе с графикой.
Если же дин. блок кривой, косой и разваливается, этого может и не произойти.
Т.к. примера блока нет, то трудно о нем судить, но Вы сами можете проверить качество блока, принудительно задав значения параметров через панель свойств (CTRL+1). Результат будет налицо.

Цитата:
Сообщение от Boxa Посмотреть сообщение
у BlockReference есть метод GetGripPoints(grips As GripDataCollection, curViewUnitSize As Double, gripSize As Integer, curViewDir As Vector3d, bitFlags As GetGripPointsFlags) As Boolean
Мои познания в .net ниже нуля, но что-то мне подсказывает, что парного ему метода SetGripPoints может не быть, т.к.
Цитата:
Ручки - это для пользователей
Если что, поправьте.

Последний раз редактировалось kp+, 09.03.2017 в 12:53.
kp+ вне форума  
 
Непрочитано 09.03.2017, 12:53
#14
Boxa

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


Цитата:
Сообщение от kp+ Посмотреть сообщение
Мои познания в .net ниже нуля, но что-то мне подсказывает, что парного ему метода SetGripPoints может не быть, т.к.
MoveGripPointsAt(grips As GripDataCollection, offset As Vector3d, bitFlags As MoveGripPointsFlags)
Правда я ошибся, эти методы есть не только у BlockReference, они есть у наследников Entity
Boxa вне форума  
 
Автор темы   Непрочитано 09.03.2017, 13:04
#15
power85


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
MoveGripPointsAt(grips As GripDataCollection, offset As Vector3d, bitFlags As MoveGripPointsFlags)
Правда я ошибся, эти методы есть не только у BlockReference, они есть у наследников Entity
Во то что надо. В C++ я ноль, можете сделать команду для Lisp на два метода?
MoveGripPointsAt - такого метода нет в Lisp и vba.
power85 вне форума  
 
Непрочитано 09.03.2017, 15:55
#16
Boxa

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


Цитата:
Сообщение от power85 Посмотреть сообщение
В C++ я ноль
Код вроде на VB.NEt был приведен.

Цитата:
Сообщение от power85 Посмотреть сообщение
можете сделать команду для Lisp на два метода?
нет, мне это было без надобности и я создание lisp функций еще не освоил.
Может более опытные товарищи помогут.
Boxa вне форума  
 
Автор темы   Непрочитано 09.03.2017, 16:05
#17
power85


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


Boxa
Спасибо за информацию. По последней книге Полещук вроде есть инф. как сделать функцию для lisp на другом языке.
В создание функций в NET как я знаю есть недостаток нужно создавать файлы компилированные для каждой версии автокад, а это не круто.
Хорошо я понял, буду выбирать.
power85 вне форума  
 
Непрочитано 09.03.2017, 16:34
#18
Boxa

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


я могу попробовать что то изобразить... но я с лисп совсем не дружу и мне для тестов нужен пример кода, который позволит выбрать объект и вызовет некую функцию передав ей id объекта и индекс ручки
Что то вроде: (GetGripPoints (entget (car (entsel))) 1) , вот только вместо выделенного, должен ID или хендл передаваться...
Boxa вне форума  
 
Автор темы   Непрочитано 09.03.2017, 16:45
#19
power85


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
но я с лисп совсем не дружу
Кстати Lisp в 10 раз проще и понятнее. Советую изучить. vba после lisp тяжелее оказался.
Я попробую сначала сам эту функцию сделать basic я знаю.
Только скажите для каждой версии автокад нужен свой файл скомпилированный в NET?
power85 вне форума  
 
Непрочитано 09.03.2017, 17:33
#20
Александр Ривилис

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


Через GetGripPoints нельзя получить ручки динамического блока.
Александр Ривилис вне форума  
 
Непрочитано 09.03.2017, 17:40
#21
Boxa

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


Спасибо за интересную задачку. Разобрался как это работает, было интересно.
Код:
[Выделить все]
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,413
Отправить сообщение для Александр Ривилис с помощью 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,499


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

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью 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,499


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Это для 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,413
Отправить сообщение для Александр Ривилис с помощью Skype™


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


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


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

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


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


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


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

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



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

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


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


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Необязательно если не используешь зависящие от разрядности библиотеки. Например, если используешь только 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,611


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
В любом случае подвигать их при помощи 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
Сообщений: 61


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

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


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

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


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


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

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


Еще раз, это просто набросок для проверки идеи, тут много чего не хватает и следует переделать, так что на свой страх и риск
Из приведенного кода сигнатура 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
Сообщений: 61


Ясно. Спасибо.
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