Обучение программированию

Автор Alal, 26.03.16, 09:13:20

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

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

pr0100

Цитата: IgorT от 17.05.17, 13:14:59
О! Похоже фрагменты позволят привязаться только  к началу координат фрагмента. Я правильно понял?
Да верно, от сюда и плясать со всей параметризацией.

IgorT

 :(
А в К-17 случайно не добавили возможность цепляться за любую геометрию макроэлементов/фрагментов в целях параметризации?

ТрындецЪ

Как на Python получить интерфейс IKompasDocument3D1?

lua

Коллеги, прошу сильно не пинать, если написал не туда. Не могу понять, как программно нарисовать отрезок в 3D с координатами относительно текущей ЛСК. Хоть и выставлена ЛСК текущей, но в результате отрезок создается относительно Начала координат      

Segment_3D->BuildingType = ksLineSegment3DTypeEnum::ksLSTTwoPoints;
Segment_3D->SetPoint (TRUE, X1, Y1, Z1);
Segment_3D->SetPoint (FALSE, X2, Y2, Z2);

Необходимо установить свойство IKompasDocument3D.CreateObjectsInCurrentLocalCS.
Doc3D.CreateObjectsInCurrentLocalCS:=True;
+ Благодарностей: 2

ТрындецЪ

Пробовал поэкспериментировать с ЛСК. ЛСК создаётся, назначается текущей.
Но, при создании отрезка, координаты его концов, которые я забиваю соответствуют координатам глобальной СК.
Хотя, в переменных для отрезка прописываются локальные координаты.
Отсюда вопрос: что дописать в код, чтобы при создании отрезка можно было вводить координаты соответствующие ЛСК?

# -*- coding: cp1251 -*-

import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
from win32com.client import Dispatch
import LDefin3D
import ksConstants3D as CONST3D7

iKompasObject = Dispatch('KOMPAS.Application.5')
iKompasObject = KAPI.KompasObject(iKompasObject)

iApplication = Dispatch('KOMPAS.Application.7')
iApplication = KAPI7.IApplication(iApplication)

##iSystemSettings = iApplication.SystemSettings
##iSystemSettings.ModelLocalCSSetActive = True
##iSystemSettings.ModelLocalCSCreateInAbsoluteCS = True

iDocument3D = iKompasObject.ActiveDocument3D()
iDocument = iApplication.ActiveDocument
iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)
iPart7 = iKompasDocument3D.TopPart
iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)

# Создаём ЛСК
iAuxiliaryGeomContainer = KAPI7.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
iLocalCoordinateSystems = iAuxiliaryGeomContainer.LocalCoordinateSystems
iLocalCoordinateSystem = iLocalCoordinateSystems.Add()
iLocalCoordinateSystem.OrientationType = CONST3D7.constants.ksAxisOrientation
iLocalCSParameters = iLocalCoordinateSystem.LocalCSParameters
iLocalCSAxesDirectionParam = KAPI7.ILocalCSAxesDirectionParam(iLocalCSAxesDirectionParam)
matrix = [0.146447, 0.853553, 0.5, 0, -0.853553, -0.146447, 0.5, 0, 0.5, -0.5, 0.707107, 0, 10, 10, 10, 1]
iLocalCoordinateSystem.InitByMatrix3D(matrix)
iLocalCoordinateSystem.Update()

# Создавать новые объекты в ЛСК
iKompasDocument3D.CreateObjectsInCurrentLocalCS=True

# Создаём отрезок по двум точкам
iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
iLineSegment3D = iLineSegments3D.Add()
iLineSegment3D.BuildingType = CONST3D7.constants.ksLSTTwoPoints
# Координаты начала в глобальной СК
iLineSegment3D.SetPoint(True, 0, 0, 0)
# Координаты конца в глобальной СК
iLineSegment3D.SetPoint(False, 50, 0, 0)
iLineSegment3D.Update()

lua

Цитата: ТрындецЪ от 04.07.17, 16:17:11
Пробовал поэкспериментировать с ЛСК. ЛСК создаётся, назначается текущей.
Но, при создании отрезка, координаты его концов, которые я забиваю соответствуют координатам глобальной СК.
Да, точно. Подтверждаю. Координаты при создании пересчитываются относительно глобальной СК.
Цитата: ТрындецЪ от 04.07.17, 16:17:11
Хотя, в переменных для отрезка прописываются локальные координаты.
А в переменных у меня тоже пересчитанные относительно глобальной...

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

pr0100

Цитата: Slaviation от 03.12.15, 13:16:11
Если процесс размещения компонента предполагалось дать пользователю, то:
Правильнее было бы дать пользователю соответствующую компасовую панель, со всеми возможностями размещения.
Сделать это можно запустив процесс KompasObject::ksExecuteKompasCommand(prAddPartFromFile, True).
После запуска этому процессу понадобится файл для вставки и процесс создаст событие BeginRequestFiles (на него надо будет предварительно подписаться).
В обработчике этого события подсовываем свой файл.
Имеем интерактивный процесс размещения компонента со всеми "наворотами".


Как на питоне подписаться на событие "BeginRequestFiles" и запустить процесс "ksExecuteKompasCommand"?

ALEXEY ZATEEV

Помогите пожалуйста: как получить в Питоне значения размерных переменных? Я инженер, что касается черчения - справляюсь, но вынужден пробовать писать скрипт на Питоне (Компас-Макро), а в программировании дуб дубом, даже азы :`(
И вообще не пойму (SDK уже до дыр прочел) как можно получить идентификаторы всех объектов чертежа?
Например, в виде множества, словаря и т. п. ... Пока с трудом представляю себе объектную модель документа Компас.
Цель -- считать значения свойств отрезка (длины, координат концов и т. д.), который уже есть на плоском чертеже (.frw), и присвоить их значения переменным Питона для дальнейшего использования. Может пример готовый есть? 8-)

НЕЙРОН

# (Python)(2020 год) Перебор (Итератор) всех отрезков и получение их координат , через API5
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()

# Итератор, перебор существующих отрезков:
iIterator = kompas_object.GetIterator()
iIterator.ksCreateIterator( 1, 0 ) #  - Cоздать итератор для перемещения по объектам документа.(0-все объекты 1-отрезки и т.д. смотреть SDK) tipSearch - тип объекта(очень много),parent - указатель на объект (для движения по группе, внутри макроэлемента, по слою).

obj = iIterator.ksMoveIterator( "F" ) # - Переместить итератор (позиционироваться на объекте) F - первый объект,N - следующий объект
CHislo_otrezkov=0

if iDocument2D.ksExistObj(obj):              # Если объекты существуют, то тогда делать цикл
    while iDocument2D.ksExistObj(obj) != 0:  # ksExistObj - Проверить существование объекта. Возвращаемое значение:(1 - в случае наличия объекта)(0 - в случае отсутствия объекта)

        CHislo_otrezkov = CHislo_otrezkov+1

        LineN  = kompas6_api5_module.ksLineSegParam(kompas_object.GetParamStruct(kompas6_constants.ko_LineSegParam))
        LineN.Init()
        LineN.x1  # Координата Х1 отрезка
        LineN.y1  # Координата Y1 отрезка
        LineN.x2  # Координата X2 отрезка
        LineN.y2  # Координата Y2 отрезка
        print ("Координаты отрезка №",LineN," Х1,Y1,X2,Y2 = ",LineN.x1,',',LineN.y1,',',LineN.x2,',',LineN.y2)

        obj = iIterator.ksMoveIterator( "N" ) # - Переместить итератор (позиционироваться на объекте) F - первый объект,N - следующий объект

iIterator.ksDeleteIterator()  # ksDeleteIterator - Удалить блок параметров навигации по модели
print('Количество отрезков в чертеже= ',CHislo_otrezkov)

Умка

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

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

#  Подключим константы 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 = application.ActiveDocument
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()

iDrawingDocument = kompas_document._oleobj_.QueryInterface(kompas_api7_module.IDrawingDocument.CLSID, pythoncom.IID_IDispatch)
iDrawingDocument = kompas_api7_module.IDrawingDocument(iDrawingDocument)


iTechnicalDemand=iDrawingDocument.TechnicalDemand
iTechnicalDemand.AutoPlacement = False
iTechnicalDemand.BlocksGabarits = (25.0, 65.0, 200.0, 263.0)
iTechnicalDemand.Update()

Скрипт размещения техтребований над основной надписью (питон 2). Нужно прописать зависимость от формата чертежа