Создать внешнюю переменную

Автор sevrya, 09.02.22, 10:08:33

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

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

sevrya

Добрый день.
Делаю приложение для Компас на питоне.
Задача такая:
1. Подключаюсь к компас.
2. Создаю деталь.
3. Строю обечайку.
4. Необходимо создать Внешнюю переменную "Dy" (внутренний диаметр) и привязать ее к эскизу, чтобы потом пользователь мог корректировать модель.
В программировании новичок. Один из вариантов создать параметризированную модель и открывать ее для редактирования в питоне. Но этот вариант не подходит.
Необходимо создать внешнюю переменную и привязать ее к эскизу средствами питон.
Пробовал использовать AddNewVariable('Dy', Dy, 'Внутреннний диамтер') - не могу разобраться с синтаксисом.
Прошу помочь разобраться.

# -*- coding: utf-8 -*-
# |test

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

Dy = 300

# Создание детали компас

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID,
                                                                     pythoncom.IID_IDispatch))
MH.iKompasObject = kompas_object

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication = application

Documents = application.Documents
#  Создаем новый документ
kompas_document = Documents.AddWithDefaultSettings(kompas6_constants.ksDocumentPart, True)

kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)


# Создание эскиза

iSketch = iPart.NewEntity(kompas6_constants_3d.o3d_sketch)
iDefinition = iSketch.GetDefinition()
iPlane = iPart.GetDefaultEntity(kompas6_constants_3d.o3d_planeYOZ)
iDefinition.SetPlane(iPlane)
iSketch.Create()
iDocument2D = iDefinition.BeginEdit()
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()

obj = iDocument2D.ksLineSeg(-Dy/2, 0, -Dy/2, -1000, 1)
obj = iDocument2D.ksLineSeg(-Dy/2, -1000, -Dy/2-8, -1000, 1)
obj = iDocument2D.ksLineSeg(-Dy/2-8, -1000, -Dy/2-8, 0, 1)
obj = iDocument2D.ksLineSeg(-Dy/2-8, 0, -Dy/2, 0, 1)
iDefinition.EndEdit()
iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)


# Создание элемента вращения
obj = iPart.NewEntity(kompas6_constants_3d.o3d_bossRotated)
iDefinition = obj.GetDefinition()
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
iCollection.SelectByPoint(0, 0, Dy/2+4)
iEdge = iCollection.Last()
iEdgeDefinition = iEdge.GetDefinition()
iSketch = iEdgeDefinition.GetOwnerEntity()
iDefinition.SetSketch(iSketch)
iRotatedParam = iDefinition.RotatedParam()
iRotatedParam.direction = kompas6_constants_3d.dtNormal
iRotatedParam.angleNormal = 360
iRotatedParam.angleReverse = 0
iRotatedParam.toroidShape = True
iRotated = kompas_object.TransferInterface(obj, kompas6_constants.ksAPI7Dual, 0)
iAxis = iPart.GetDefaultEntity(kompas6_constants_3d.o3d_axisOY)
iRotatedAxis = kompas_object.TransferInterface(iAxis, kompas6_constants.ksAPI7Dual, 0)
iRotated.Axis = iRotatedAxis
iThinParam = iDefinition.ThinParam()
iThinParam.thin = False
obj.name = "Элемент вращения:1"
iColorParam = obj.ColorParam()
iColorParam.ambient = 0.5
iColorParam.color = 9474192
iColorParam.diffuse = 0.6
iColorParam.emission = 0.5
iColorParam.shininess = 0.8
iColorParam.specularity = 0.8
iColorParam.transparency = 1
obj.Create()


p3452

Странный подход!?
Если вы, создаете Деталь, с нуля, программно - зачем вам переменные, тем более "внешние"?
Может изменить подход - создать параметрическую Деталь, с вашими переменными (шаблон), а потом уже программно открывать эту Деталь-шаблон и менять значения переменных, получая новые детали с нужными вам размерами? 

Михаил88

# -*- coding: utf-8 -*-

import pythoncom
from win32com.client import Dispatch, gencache

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

#  Получи интерфейс активного документа
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iPart7 = kompas_document_3d.TopPart
iVariable7 = iPart7.AddVariable('Dy', 30, '')
iVariable7.External = True

kompas_document_3d.RebuildDocument()
+ Благодарностей: 1

p3452

Вот, вот!
Хорошая демонстрация всей бесполезности подхода ТС:
- Создали переменную, присвоили ей значение и, ...?
- "Деталь" живет своей жизнью, а переменная - своей (они никак не связаны).

sevrya

Цитата: p3452 от 09.02.22, 12:51:37Может изменить подход - создать параметрическую Деталь, с вашими переменными (шаблон), а потом уже программно открывать эту Деталь-шаблон и менять значения переменных, получая новые детали с нужными вам размерами? 
Так я уже умею ))).
Нужно было именно создать переменную.
Михаил88, cпасибо помогло.
Теперь буду учиться привязывать эту переменную к эскизу, чтобы можно было из компаса менять модель.

p3452

Цитата: sevrya от 09.02.22, 13:34:32Теперь буду учиться привязывать эту переменную к эскизу, чтобы можно было из компаса менять модель.
:-)))
Да! Легких путей вы не ищите.

sevrya

Цитата: p3452 от 09.02.22, 13:39:14:-)))
Да! Легких путей вы не ищите.

В том-то и дело, ищу.
Вот тему создал, может кто подскажет.
Размерную линию в эскизе поставил
Сейчас пытаюсь привязать ее к отрезку и сделать ее неинформационной.

Slaviation

Добрый день.
Цитата: undefinedСейчас пытаюсь привязать ее к отрезку и сделать ее неинформационной.
Посмотрите пример во вложении. Запускать на активном 2D.
+ Благодарностей: 1

Михаил88

10.02.22, 08:56:27 #8 Последнее редактирование: 10.02.22, 11:25:50 от Михаил88
Цитата: sevrya от 09.02.22, 13:34:32Теперь буду учиться привязывать эту переменную к эскизу, чтобы можно было из компаса менять модель.

Пример как можно привязать

# -*- 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)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID,
                                                             pythoncom.IID_IDispatch))

#  Получи интерфейс активного документа
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iPart7 = kompas_document_3d.TopPart
iFeature7 = kompas_api7_module.IFeature7(iPart7)

subFeatures = iFeature7.SubFeatures(kompas6_constants.ksOperTree, True, False)
print(subFeatures)
for element in subFeatures:
    name_element = element.Name
    if name_element == 'Эскиз:1':
        iFeature7_sketch = kompas_api7_module.IFeature7(element)
        iVariables = iFeature7_sketch.Variables(False, False)
        iVariable7 = iFeature7_sketch.Variable(False, False, 'v1')
        iVariable7.Expression = 'Dy'
        break

kompas_document_3d.RebuildDocument()


Похоже теперь у вас есть вся информация для того, что бы выполнить задачу

sevrya

Не могу разобраться с параметризацией.
# -*- coding: utf-8 -*-
# |test

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

Dy = 300

# Создание детали компас

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID,
                                                                     pythoncom.IID_IDispatch))
MH.iKompasObject = kompas_object

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(
    Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication = application

Documents = application.Documents
#  Создаем новый документ
kompas_document = Documents.AddWithDefaultSettings(kompas6_constants.ksDocumentPart, True)

kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)
iFeature7 = kompas_api7_module.IFeature7(iPart7)

iVariable7 = iPart7.AddVariable('Dy', Dy, 'Внутренний диаметр') # Создание переменной
iVariable7.External = True                                      # Делаем ее внешней

iDocument3D.RebuildDocument()


# Создание эскиза

iSketch = iPart.NewEntity(kompas6_constants_3d.o3d_sketch) # Создать новый интерфейс объекта и получить указатель на него (Константа API компас.Эскиз)
iDefinition = iSketch.GetDefinition()                      # Получить указатель на интерфейс параметров объектов и элементов
iPlane = iPart.GetDefaultEntity(kompas6_constants_3d.o3d_planeYOZ) #Получить указатель на интерфейс объекта, создаваемого системой по умолчанию
iDefinition.SetPlane(iPlane)
iSketch.Create()
iDocument2D = iDefinition.BeginEdit()
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()

obj1 = iDocument2D.ksLineSeg(-Dy/2, 0, -Dy/2, -1000, 1)
obj2 = iDocument2D.ksLineSeg(-Dy/2, -1000, -Dy/2-8, -1000, 1)
obj3 = iDocument2D.ksLineSeg(-Dy/2-8, -1000, -Dy/2-8, 0, 1)
obj4 = iDocument2D.ksLineSeg(-Dy/2-8, 0, -Dy/2, 0, 1)


iLDimParam = kompas6_api5_module.ksLDimParam(kompas_object.GetParamStruct(kompas6_constants.ko_LDimParam))
#iDimDrawing = kompas6_api5_module.ksDimDrawingParam(iLDimParam.GetDPar())
#iDimDrawing.Init()
#iDimDrawing.ang = 0
#iDimDrawing.lenght = 0
#iDimDrawing.pl1 = False
#iDimDrawing.pl2 = False
#iDimDrawing.pt1 = 1
#iDimDrawing.pt2 = 1
#iDimDrawing.shelfDir = 0
#iDimDrawing.textBase = 0
#iDimDrawing.textPos = 0
iLDimSource = kompas6_api5_module.ksLDimSourceParam(iLDimParam.GetSPar())
iLDimSource.Init()
iLDimSource.basePoint = 1
iLDimSource.dx = 50
iLDimSource.dy = 20
iLDimSource.ps = 2
iLDimSource.x1 = -Dy/2
iLDimSource.y1 = 0
iLDimSource.x2 = 0
iLDimSource.y2 = 0
iDimText = kompas6_api5_module.ksDimTextParam(iLDimParam.GetTPar())
iDimText.Init(0)
iDimText.bitFlag = 1
iDimText.sign = 0
iDimText.style = 3
iDimText.stringFlag = False
obj = iDocument2D.ksLinDimension(iLDimParam)

subFeatures = iFeature7.SubFeatures(kompas6_constants.ksOperTree, True, False)
print(subFeatures)
for element in subFeatures:
    name_element = element.Name
    if name_element == 'Эскиз:1':
        iFeature7_sketch = kompas_api7_module.IFeature7(element)
        iVariables = iFeature7_sketch.Variables(False, False)
        iVariable7 = iFeature7_sketch.Variable(False, False, 'v1')
        iVariable7.Expression = 'Dy'
        break

kompas_document_3d.RebuildDocument()

iDefinition.EndEdit()

Михаил88

+ Благодарностей: 1

sevrya


yaryi16605

12.10.22, 11:55:33 #12 Последнее редактирование: 12.10.22, 16:36:45 от yaryi16605
Знатоки подскажите пожалуйста!
Есть фрагмент (документ 2D) с внешними переменными. Требуется замена значений данных переменных программно (чтение и запись). Дошёл до этапа чтения количества переменных в массиве, но при этом выдает количество 0, что делаю не так?
iDocument2D = kompas_object.ActiveDocument2D()
ref2D = iDocument2D.reference
iDocument2D_par = kompas_object.GetParamStruct(kompas6_constants.ko_VariableParam)
#присваивает значение 0.0 (что это значит?)
Array_1 = iDocument2D.ksGetDocVariableArray(0) #Вместо 0 прописываю ref2D, ничего не меняется
ref = Array_1.reference
Count = Array_1.ksGetArrayCount() #Собственно уже здесь выдаёт значение 0 (хотя переменные есть)

Компас 19

Михаил88

12.10.22, 16:36:26 #13 Последнее редактирование: 12.10.22, 16:51:36 от Михаил88
API5

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache, VARIANT

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(
    Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID,
                                                            pythoncom.IID_IDispatch))

iDocument2D = kompas_object.ActiveDocument2D()
par = kompas_object.GetParamStruct(85)
ks_dynamic_array = iDocument2D.ksGetDocVariableArray(0)
ks_dynamic_array.ksGetArrayItem(0, par)
par.value = 890
ks_dynamic_array.ksSetArrayItem(0, par)
iDocument2D.ksSetDocVariableArray(0, ks_dynamic_array, False)

API7

# -*- coding: utf-8 -*-
import pythoncom
from win32com.client import Dispatch, gencache

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

kompas_document = application.ActiveDocument
iKompasDocument2D = kompas_api7_module.IKompasDocument2D(kompas_document)
iKompasDocument2D1 = kompas_api7_module.IKompasDocument2D1(iKompasDocument2D)

iVariable7 = iKompasDocument2D1.Variable(False, 'R')
iVariable7.Value = 102

iKompasDocument2D1.RebuildDocument()
+ Благодарностей: 1