Ссылка на свойство в тексте на чертеже

Автор DMortem, 04.06.26, 23:49:33

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

DMortem

Добрый вечер. У меня простая задачка, мне надо создать эскиз на грани модели и вставить в него текст с ссылкой на свойство документа. Для примера я скинул код для работы в простом чертеже. Получается если просто задать текст он вставится нормально, но ссылкой не создается, конкретно в данном примере после присвоения я вывожу свойства, что бы посмотреть что там назначено и почему то не привязывается объект, и не понимаю почему. Я уже пользовался назначением ссылок, назначал значение переменной в свойство документа с помощью InsertHypertextReference, но в данном случае, такое присвоение не сработало. Не могу разобраться в чем я ошибся.

DMortem

#1
Покопавшись несколько дней в поисках ответа, я смог сделать присвоение свойства в 2d документе.
# -*- coding: utf-8 -*-

import pythoncom
from win32com.client import Dispatch, gencache

#  Получи константы
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants

#  Получи API интерфейсов версии 7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
kompas_api_object = kompas_api7_module.IKompasAPIObject(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IKompasAPIObject.CLSID, pythoncom.IID_IDispatch))
application = kompas_api_object.Application

#  Получи интерфейс активного документа
kompas_document = application.ActiveDocument

#  Создай графический объект "Текст на чертеже"
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)

iPropertyMng = kompas_api7_module.IPropertyMng(application)
iProperty = iPropertyMng.GetProperty(kompas_document_2d, 0)

iPropertyKeeper = kompas_api7_module.IPropertyKeeper(kompas_document_2d)
iPropertyKeeper.SetPropertyValue(iProperty, "Тест", False)

views_and_layers_manager = kompas_document_2d.ViewsAndLayersManager
views = views_and_layers_manager.Views
view = views.ActiveView
drawing_container = kompas_api7_module.IDrawingContainer(view)
drawing_texts = drawing_container.DrawingTexts
drawing_text = drawing_texts.Add()
drawing_text.X = 60.0289685
drawing_text.Y = 161.6975367
drawing_text.Angle = 0.0
drawing_text.HFormat = kompas6_constants.ksHFormatNot
drawing_text.VFormat = False
drawing_text.Allocation = kompas6_constants.ksAlLeft
drawing_text.MirrorSymmetry = False

text = kompas_api7_module.IText(drawing_text)
text.Style = kompas6_constants.ksTSDrawingAnnotation

text_line = text.Add()
text_line.Style = kompas6_constants.ksTSDrawingAnnotation
text_line.Step = 7.0
text_line.Align = kompas6_constants.ksAlignLeft
text_line.IndentedLine = 0.0
text_line.StepBeforeParagraph = 0.0
text_line.StepAfterParagraph = 0.0
text_line.LeftEdge = 0.0
text_line.RightEdge = 0.0
text_line.Level = 0
text_line.Numbering = kompas6_constants.ksTNumbNoNumber
text_line.NewPage = False

text_item = text_line.Add()
text_item.ItemType = kompas6_constants.ksTItHyperText
text_item.NewLine = False

text_font = kompas_api7_module.ITextFont(text_item)
text_font.FontName = "GOST type A"
text_font.Height = 5.0
text_font.WidthFactor = 1.0
text_font.Color = 0
text_font.Bold = False
text_font.Italic = True
text_font.Underline = False
text_font.TextLineStep = False

hypertext_reference_param = kompas_api7_module.IHypertextReferenceParam(text_item)
hypertext_reference_param.TextLineIndex = 0
hypertext_reference_param.HypertextType = kompas6_constants.ksHTObjectProperty
hypertext_reference_param.LinkObject = kompas_document
hypertext_reference_param.PropertyId = iProperty.Id
text_item.Update()
drawing_text.Update()
Получается когда надо сделать ссылку на свойство, то передается объект и ид свойства, в данном случае я передал сам документ.
тут все отлично, дальше мне надо аналогично сделать в модели. Но тут уже не получается, когда я на активном эскизе пытаюсь передать документ модели, то ссылка не записывается. пример скрипта прикрепил.

P.S. Я вручную сделал ссылку на свойство документа и решил посмотреть что за LinkObject у ссылки, так как вернется у нас IKompasObject я посмотрел тип 10022 - это фрагмент, я попытался передать в своем коде фрагмент который я редактирую и результата это не дало, идей уже не остается.

DMortem

Посидев еще немного времени, я решил макросом создавать эскиз на модели с маркировкой, потом в этом же эскизе руками внести текст со ссылкой на свойство. Затем я через API получаю нужный эскиз и делаю iFragment = iSketch.BeginEdit() от него я получаю reference и смотрю что записано в тексте маркировки hypertext_reference_param.LinkObject и у этого объекта я так же получаю reference и они совпадают с iFragment, однако если попробовать сделать новую ссылку передав iFragment, то ссылка не сформируется.

Student2025

#3
...
iProperty = iPropertyMng.GetProperty(kompas_document_3d, 4.0)
...
iSketch.Update() # - без него вылетает ошибка
...

Хоть в справке и написано, и проверено что hypertext_reference_param.LinkObject = kompas_document_3d не будет работать и возвращает пустое значение.
То есть ссылка не создается.

DMortem

Цитата: Student2025 от Сегодня в 11:25:51Хоть в справке и написано, и проверено что hypertext_reference_param.LinkObject = kompas_document_3d не будет работать и возвращает пустое значение.
То есть ссылка не создается.

я пробовал передавать все что только можно, нигде ссылка не создавалась.

p3452

Начните с малого:
1 - создать новое свойство (в Документе) с заданым именем и параметрами,
2 - получить параметры свойства (Документа) по заданному имени,
3 - повторить п.п.1,2 - не для Документа, а для Библиотеки свойств.

После ЭТОГО, возможно, все у Вас получится...

p/s: Работа со свойствами неоднократно обсуждалась на Форуме.

DMortem

#6
Цитата: p3452 от Сегодня в 15:41:12Начните с малого:
1 - создать новое свойство (в Документе) с заданым именем и параметрами,
2 - получить параметры свойства (Документа) по заданному имени,
3 - повторить п.п.1,2 - не для Документа, а для Библиотеки свойств.

После ЭТОГО, возможно, все у Вас получится...

p/s: Работа со свойствами неоднократно обсуждалась на Форуме.
У меня есть макросы которые вставляют ссылки из переменных в свойства, тут никаких вопросов не возникало, дальше я привел пример, как я установил ссылку в тексте на чертеже, но аналогичные действия не могу провернуть конкретно в модели, именно вопрос в LinkObject, ручное создание показывает что там передается фрагмент, но если я передам фрагмент который я редактирую, то я получу пустой текст, который будет иметь и ID свойства и ID объекта который я передал, но не будет иметь текст.
Попробовал при редактировании назначить свойство фрагменту
    iFragment = iSketch.BeginEdit()
    empty_val = VARIANT(pythoncom.VT_EMPTY, None)
    new_prop = iPropertyMng.AddProperty(empty_val, iProperty)
    new_prop.Update()
    iProperties = iPropertyMng.GetProperties(iFragment)
    print(iProperties[0].Name)
    iKeeper = kompas_api7_module.IPropertyKeeper(iFragment)
    iKeeper.SetPropertyValue(new_prop, value, False)
    print(iKeeper.GetPropertyValue(new_prop, 0, False))
Свойство добавилось, при создании свойства вернул True, но если посмотреть потом что он записал, то окажется что (False, 0, False). Возможно фрагменту нельзя ничего присвоить, или я не так это сделал.