Программирование пространственных кривых.

Автор Flexo, 22.03.12, 19:49:19

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

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

Flexo

Здравствуйте, я пишу диплом "Моделирование параметризуемых 3-D объектов в среде KOMPAS".
Одна из задач - построение детали с использованием пространственной кривой, которую я задаю аналитичиски в скрипте.
Кривую хочу использовать, например, для операции "Кинематическая операция".
Для реализации использую Библиотеку Kompas-macro.

Насколько я понял, в Kompas есть объект spline-кривая, с помощью которой можно сделать нечто подобное. Но.
1.Есть ли возможность запрограммировать "обычную" кривую в пространстве? Протеворечит ли это механике приложения(Kompas)?
2.С помощью чего это("обычную" кривую) будет лучше осуществить?

А, что Вы ещё можете делать в Компасе в плане программирования, раз сразу взялись за кривые?

Flexo

Для Компаса первый раз что-то пишу. У меня была курсовая работа в которой я поверхностно ознакомился с возможностями Kompas - macro. Создавал деталь с использованием спирали, на основе сгенерированного скрипта. В скрипте у меня были введены параметры в зависимости от которых строилась деталь. Там я использовал стандартный объект "цилиндрическая спираль".  Базовое знание ООП - есть. Обучался преимущественно на С++. Есть желание изучить и использовать язык Python.

Зачем Вам, Python перейдите на  Visual C, тем более, если у Вас есть знание языка.

Flexo

Подскажите пожалуйста, как это сделать с помощью Visual C? Это оформляется как отдельная библиотека для Kompas?

Python потому что хотелось бы изменять деталь редактируя скрипт.

Вам нужна папка с примерами c:\Program Files\ASCON\KOMPAS-3D V13\SDK\C++\
Непосредственно SDK c:\Program Files\ASCON\KOMPAS-3D V13\SDK\SDK.chm

Flexo

Таким образом, используя мастер создания библиотек, я могу это оформить как скрипт-документ на основе visual studio, по которому я получу деталь. Потом залезу в скрипт, поменяю параметры и получу измененную деталь. Так?

Лучше сделать DLL (RTW) или EXE и не лазить никуда, а с помощью придуманного Вами интерфейса управлять Компасом.

Flexo

Я понимаю, но было пожелание со стороны научного руководителя в такой реализации. Чтобы мы работали со скриптом, а не с интерфейсом в среде Компаса.  :um:
Кроме того, я подозреваю, что библиотека такого типа либо не нужна(т.к. возможно бесполезна), либо уже есть.

Вопрос остается тот же.
У меня еще достаточно(до июля) времени, чтобы выбрать правильный и полезный путь. Если у Вас есть, что добавить я хочу это знать.


Я, понимаю пожелание научного руководителя, но диплом Ваш и Вам решать кем, Вам быть.

chelkar

В обычном случае, Язык и Среда разработки, сугубо личное дело.
В данном случае есть требование задания - скрипт на Питоне.
В прицепе простейщий скрипт для построения Сплайна в 3D.

Flexo

В sdk есть метод прямоугольника? или только ksLineSeg?

Есть для API7- IRectangle
для API5- ksRectangleParam
ksDocument2D.ksRectangle



Flexo

Спасибо!
По поводу кривой. Решил с помощью сплайна сделать, питон-скриптом. Для тривиальных кривых в виде пружинок рисует. Расчитываются координаты узловых точек и соединяются сплаином. В данный момент рисую эскиз прямоугольника в начале кривой, и перпендикулярно ей.

Flexo

А как правильно получить структуру параметра для ksDocument2D.ksRectangle? Покрутил "и туда, и сюда" - не получается. Вот такой вот нерабочий вариант:

iDocument2D = iDefinition.BeginEdit()

prym=iDocument.ksRectangleParam(kompas.GetParamStruct(ko_RectangleParam));
prym.Init();
prym.x=0;
prym.y=0;
prym.ang=0.0;
prym.height=10;
prym.width=10;
prym.style=1;
iDocument2d.ksRectangle(prym,0);
iDefinition.EndEdit()

На Delphi, так:
prym:=ksRectangleParam(kompas.GetParamStruct(ko_RectangleParam));
...

Flexo

А в какой  библиотеке лежит ksRectangle , буквально название?

import Kompas10API7 - по идее оно.

Я хочу хотя бы в таком виде запустить

"Rectangle(0.0,0.0,0.0,10.0,10.0,1,0)" .

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

import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH

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

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

iDocument2D = iKompasObject.ActiveDocument2D()
iDocument = iApplication.ActiveDocument
iKompasDocument2D = KAPI7.IKompasDocument2D(iDocument)


iObjParam = KAPI.ksRectangleParam(iKompasObject.GetParamStruct(LDefin2D.ko_RectangleParam))
iObjParam.Init()
iObjParam.x = -80.69791666666
iObjParam.y = -59.79583333333
iObjParam.ang = 0.0
iObjParam.height = 19.0
iObjParam.width = 53.0
iObjParam.style = 1
iDocument2D.ksRectangle(iObjParam)

Flexo

Спасибо за Ваши ответы, они помогают разобраться!
По поводу, записи макросов - у меня, по крайней мере, записывает прямоугольники как 4 отрезка, что не конструктивно. Кроме того, не всегда он(компас-макро) может построить, то, что записал. Например, операция "плоскость перепендикулярно ребру и через точку" записывается, но не "воспроизводится". (Правда, зависит от того как именно строилась, буквально по тому как кликаешь). Ваш прямоугольник заработал в таком виде:

import Kompas10API5 as KAPI
import Kompas10API7 as KAPI7
import pythoncom
from win32com.client import Dispatch
import LDefin2D
import LDefin3D
import ksConstants as CONST2D7
import ksConstants3D as CONST3D7
import MiscellaneousHelpers as MH

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

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

iDocument3D = iKompasObject.ActiveDocument3D()

iDocument = iApplication.ActiveDocument
iKompasDocument3D = KAPI7.IKompasDocument3D(iDocument)

iPart = iDocument3D.GetPart(LDefin3D.pTop_Part)
iSketch = iPart.NewEntity(LDefin3D.o3d_sketch)
iDefinition = iSketch.GetDefinition()
iPlane = iPart.GetDefaultEntity(LDefin3D.o3d_planeXOY)
iDefinition.SetPlane(iPlane)
iSketch.Create()

iDocument2D = iDefinition.BeginEdit()

iObjParam = KAPI.ksRectangleParam(iKompasObject.GetParamStruct(LDefin2D.ko_RectangleParam))
iObjParam.Init()
iObjParam.x = -80.69791666666
iObjParam.y = -59.79583333333
iObjParam.ang = 0.0
iObjParam.height = 19.0
iObjParam.width = 53.0
iObjParam.style = 1
iDocument2D.ksRectangle(iObjParam)
iDefinition.EndEdit()


Я то записывал в 2D, а вы воспроизводите в 3D, поэтому Вам приходится брать указатель на 2D документ у эскиза.
iDocument2D = iDefinition.BeginEdit()