Переменные - не обновляется поле "Комментарий"

Автор KrissKross, 15.02.17, 14:15:43

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

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

KrissKross

Странное дело
меняю поле "Комментарий"
как   через API7 - Variable7
так и через API5 - ksVariable

1. Отладчик видит изменение
2. Повторный запуск чтения переменных видит изменения

а в окне Компас - старое значение
(сохранение и повторное открытие файла - не помогает)

Мистика
черт побери


ded_yagyn

А как работать с переменными в 2D документе?
Программно добавлять новые, удалять и менять комментарий.

Mary

В итоге по программному изменению переменных - я правильно понимаю, что  для компаса V16 нет никакой возможности работать с не-внешними переменными?

ТрындецЪ

Цитата: Mary от 13.04.18, 12:01:11
В итоге по программному изменению переменных - я правильно понимаю, что  для компаса V16 нет никакой возможности работать с не-внешними переменными?
Работать с пользовательскими переменными можно через IFeature7.
Чтобы добраться до переменных эскизов, операций и т.п., нужно "подлазить" через интерфейс IModelObject конкретного объекта модели (эскиза, операции и т.п.)


Mary

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

не работает( - так же записывается куда-то.
у меня правда была очень высока вероятность накосячить по дороге..  буду признательна за ревизию - файлы во вложении

ТрындецЪ

Цитата: Mary от 13.04.18, 14:13:01
...буду признательна за ревизию - файлы во вложении
Алгоритм работы опишите, не пойму что Вы пытаетесь получить.

Mary

Пока записывала алгоритм нашла в сдк ответ на вопрос почему не работает  -  свойство доступно только для чтения.

Так что можете посоветовать другой подход?
Как записать новое значение в переменную компонента сборки, не делая соответствующей внешней переменной?

Задача в целом: есть детали с длинной заданной внешней переменной, включаю их в сборку, соответственно редактирую длину в окне переменных. Но когда сборка становится большой, уже сложновато их откапывать и соотносить (ведь навигации в окне переменных нет), поэтому делаю формочку где списком выведены только детали с переменной длиной. Выбираю строку - деталь подсвечивается в графическом окне,  в entry на моей форме выводится значение длины для редактирования.

по алгоритму:
в основном вопрос к функции  SetNewLeng - пытаюсь  значение из  поля ввода вписать в значение переменной компонента:
- определить индекс компонента в сборке
- прочитать из поля Entry новое значение
- получаю ссылку на компонент через Parts.Part
- получаю ссылку на переменную и ... пытаюсь ее записать.  :%:

в остальном работа программки устраивает, файлик приложила - вдруг есть еще какая хитрая настройка

ТрындецЪ

Не работает, потому что Вы получали интерфейс переменной в источнике (файле детали), а не компоненте сборки.
Нужно так:
Variable = IFeature7.Variable(True, False, 0)
В источник записывалось новое значение, но т.к. Update источника не было, то изменения не сохранялись.
+ Благодарностей: 1

Mary

Заработало! теперь не понимаю что же тогда записывалось, но работает)
Спасибо, очень выручили!

ТрындецЪ

Цитата: Mary от 13.04.18, 15:38:39
...теперь не понимаю что же тогда записывалось...
Цитата: ТрындецЪ от 13.04.18, 15:19:47
В источник записывалось новое значение, но т.к. Update источника не было, то изменения не сохранялись.
Чтобы Update() источника провести, нужно было бы файл модели открывать, получать от его документа IPart7 = doc3D.TopPart и его обновлять и перестраивать. По-моему, как-то так.