Сообщество программистов Autodesk в СНГ
ADN Club => Civil 3D API => Тема начата: Павел55 от 26-11-2019, 08:57:36
-
Здравствуйте! Подскажите как добраться до ObjectId объектов из которых состоит сложный объект автокада или Civil3D? Например метка поверхности состоит из MText и Leader (выноска), если её расчленить. Как можно работать с выноской напрямую? Например чтобы добраться до координат её вершин и т.п.
-
Сложный объект - это же custom entity - как он сделан зависит от создателя.
Наверно можно только разбить сложный объект и получить кучу примитивов ;D
-
Наверно можно только разбить сложный объект и получить кучу примитивов
Думал об этом, расчленить, получить Id нужного объекта, потом отменить транзакцию. Но это какой-то очень неправильный путь. У метки через точку можно получить BlockId, я так понимаю это BlockReference, если не ошибаюсь. Может из него можно как-то получить составные части? Но через точку, кроме атрибутов я там ничего не смог получить.
-
Думал об этом, расчленить, получить Id нужного объекта, потом отменить транзакцию.
Отменять транзакцию не нужно. Метод explode не добавляет примитивы в базу.
-
Например метка поверхности состоит из MText и Leader (выноска), если её расчленить. Как можно работать с выноской напрямую? Например чтобы добраться до координат её вершин и т.п.
С метками в Civil 3D сложная ситуация. Через API Civil 3D можно получить некоторые её свойства напрямую, но именно сами текстовые значения - нет. Помогает только Explode. Вот пример: https://adndevblog.typepad.com/infrastructure/2013/04/get-cogopoint-label-text.html
Про координаты вершин что-то не понял. Какие вершины у метки?
-
Про координаты вершин что-то не понял. Какие вершины у метки?
У метки когда она в смещённом положении рисуется выноска (объект типа Leader), и у неё есть вершины.
-
Павел55,
Собственно говоря тебе уже всё объяснили. В Civil 3D API нет возможности получить эту информацию, но используя метод Entity.Explode, ты можешь получить объекты, составляющие метку и проанализировать их.
-
У метки когда она в смещённом положении рисуется выноска (объект типа Leader), и у неё есть вершины.
Есть такое. См. следующие ссылки:
- Label.Location: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/c21cf97b-aee1-0047-3399-b376796bfbfd.htm
- Label.AnchorInfo: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/b2b734b9-715e-4e65-1e76-cf9cba33d4db.htm
- AnchorInfo.Location: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/4c68f045-50f0-62a9-92f8-168db628680a.htm
P.S.
Определить, что метка является смещённой: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/02b99712-a296-0dce-1008-a0a75c718a8d.htm
Теория по теме (на английском): https://civilizeddevelopment.typepad.com/civilized-development/2013/08/dragging-labels-in-2014.html
-
https://adndevblog.typepad.com/infrastructure/2013/04/get-cogopoint-label-text.html
но используя метод Entity.Explode, ты можешь получить объекты
Этот метод возвращает коллекцию объектов без ObjectId, т.е. как бы это копии объектов из которых состоит блок, но не сами эти объекты. В официальном гиде пишут, что если вы хотите вносить в эти объекты изменения, то должны стерать оригинальный объект, а новый заносить в БД на чертёж. Но внутри метки, я подозреваю, просто взять и подменить объект не получится. А методов изменяющих положение выноски (Leader) через точку не меняя положения самой метки тоже нет.
Есть такое. См. следующие ссылки:
- Label.Location: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/c21cf97b-aee1-0047-3399-b376796bfbfd.htm
- Label.AnchorInfo: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/b2b734b9-715e-4e65-1e76-cf9cba33d4db.htm
- AnchorInfo.Location: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/4c68f045-50f0-62a9-92f8-168db628680a.htm
P.S.
Определить, что метка является смещённой: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/02b99712-a296-0dce-1008-a0a75c718a8d.htm
Теория по теме (на английском): https://civilizeddevelopment.typepad.com/civilized-development/2013/08/dragging-labels-in-2014.html
Спасибо, буду углубляться в материал.
-
Но внутри метки, я подозреваю, просто взять и подменить объект не получится.
До сих пор ничего небыло сказано про изменение - речь шла только про получение информации. Безусловно этот метод не поможет в изменении свойств метки. Свойства метки можно менять только через её API. Если тех свойств, на которые указал Дмитрий Загорулькин будет недостаточно можно еще исследовать DXF-коды метки. Иногда изменения DXF-кодов позволяют изменить свойства объектов. Но это будет недокументированное поведение.
-
изменения DXF-кодов позволяют изменить свойства объектов
Исследовал DXF коды, там нельзя добраться до вершин выноски, но в итоге получилось получить нужный эффект через метод .MoveStretchPointsAt, который позвозяет получить доступ к вершинам выноски через ручки объекта. Однако возникает одна дополнительная проблема, не знаю нужно ли создавать отдельную тему?
Если выполнять этот метод в событии объекта, то метод не срабатывает. Я так понимаю потому что объект блокируется, или типа того, во время срабатывания события. Не могу понять как это обойти.
-
Не могу понять как это обойти.
В событии объекта сохранять его ObjectId, а модификацию выполнять в другом событии (не объекта).
-
В событии объекта сохранять его ObjectId, а модификацию выполнять в другом событии (не объекта).
В событиии Modified выполняю рассчёты и сохраняю их в поле объекта. В событии Application.Idle проверяю флаг на изменение объекта и там же его модифицирую. Не знаю насколько это оптимально, но напоминает Update() в Unity3D. Спасибо за подсказку)
В итоге удалось добиться нужного поведения.