Странное дело
меняю поле "Комментарий"
как через API7 - Variable7
так и через API5 - ksVariable
1. Отладчик видит изменение
2. Повторный запуск чтения переменных видит изменения
а в окне Компас - старое значение
(сохранение и повторное открытие файла - не помогает)
Мистика
черт побери
Ответ тут http://forum.ascon.ru/index.php/topic,29283.msg237274.html#msg237274
А как работать с переменными в 2D документе?
Программно добавлять новые, удалять и менять комментарий.
В итоге по программному изменению переменных - я правильно понимаю, что для компаса V16 нет никакой возможности работать с не-внешними переменными?
Цитата: Mary от 13.04.18, 12:01:11
В итоге по программному изменению переменных - я правильно понимаю, что для компаса V16 нет никакой возможности работать с не-внешними переменными?
Работать с пользовательскими переменными можно через IFeature7.
Чтобы добраться до переменных эскизов, операций и т.п., нужно "подлазить" через интерфейс IModelObject конкретного объекта модели (эскиза, операции и т.п.)
Интерфейс IVariable7.
IVariable7 - в справке нахожу только для 2D, как к сборке применить?
с IFeature7 добраться-то до переменных получилось - и даже с записью ок, не ругается и даже куда-то записывает... только в приложении не отображается(
def SetNewLeng(event):
ind = int(COUNT.get()) #индекс компонента в выборке
i = listOfIndex[ind] #индекс компонента в дереве сборки
NewLeng = float(EntryL.get())
objForSelect = topPart.Parts.Part(listOfIndex[ind])
print objForSelect
IFeature7 = objForSelect._oleobj_.QueryInterface(KAPI7.NamesToIIDMap['IFeature7'], pythoncom.IID_IDispatch)
IFeature7 = KAPI7.IFeature7 (IFeature7)
Variable = IFeature7.Variable(True, True, 0)
Variable.Value = NewLeng
print Variable
doc3D.RebuildDocument
IVariable7 -
objForSelect.Update()
objForSelect.RebuildModel(True)
doc3D.RebuildDocument()
не работает( - так же записывается куда-то.
у меня правда была очень высока вероятность накосячить по дороге.. буду признательна за ревизию - файлы во вложении
Цитата: Mary от 13.04.18, 14:13:01
...буду признательна за ревизию - файлы во вложении
Алгоритм работы опишите, не пойму что Вы пытаетесь получить.
Пока записывала алгоритм нашла в сдк ответ на вопрос почему не работает - свойство доступно только для чтения.
Так что можете посоветовать другой подход?
Как записать новое значение в переменную компонента сборки, не делая соответствующей внешней переменной?
Задача в целом: есть детали с длинной заданной внешней переменной, включаю их в сборку, соответственно редактирую длину в окне переменных. Но когда сборка становится большой, уже сложновато их откапывать и соотносить (ведь навигации в окне переменных нет), поэтому делаю формочку где списком выведены только детали с переменной длиной. Выбираю строку - деталь подсвечивается в графическом окне, в entry на моей форме выводится значение длины для редактирования.
по алгоритму:
в основном вопрос к функции SetNewLeng - пытаюсь значение из поля ввода вписать в значение переменной компонента:
- определить индекс компонента в сборке
- прочитать из поля Entry новое значение
- получаю ссылку на компонент через Parts.Part
- получаю ссылку на переменную и ... пытаюсь ее записать. :%:
в остальном работа программки устраивает, файлик приложила - вдруг есть еще какая хитрая настройка
Не работает, потому что Вы получали интерфейс переменной в источнике (файле детали), а не компоненте сборки.
Нужно так:
Variable = IFeature7.Variable(True, False, 0)
В источник записывалось новое значение, но т.к. Update источника не было, то изменения не сохранялись.
Заработало! теперь не понимаю что же тогда записывалось, но работает)
Спасибо, очень выручили!
Цитата: Mary от 13.04.18, 15:38:39
...теперь не понимаю что же тогда записывалось...
Цитата: ТрындецЪ от 13.04.18, 15:19:47
В источник записывалось новое значение, но т.к. Update источника не было, то изменения не сохранялись.
Чтобы Update() источника провести, нужно было бы файл модели открывать, получать от его документа IPart7 = doc3D.TopPart и его обновлять и перестраивать. По-моему, как-то так.