Винтовая линия Delphi.

Автор Acabar, 25.05.13, 15:27:27

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

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

Acabar

Здравствуйте! Создаю САПР приложение на основе КОМПАС 3Д и возник вопрос "Как задать винтовую линию" (использую Delphi). Также после просмотра похожих приложений увидел, что они строятся на библиотеках, я же вызываю команды напрямую без подключения файла. Подскажите в чем преимущество библиотек и если не сложно, кто ориентируется в этих вопросах, скинуть ссылку на описание как они создаются. Также был бы признателен если у кого-то есть ссылка по функциям вызова различных кривых, вырезании кинематически и т.д.. Спасибо за помощь!

IConicSpiralDefinition - Интерфейс параметров конической спирали.
ICylindricSpiralDefinition - Интерфейс параметров цилиндрической спирали.
ISpirals3D - Коллекция спиралей 3D.
IConicSpiral3D - Коническая спираль.
ICylindricSpiral3D - Цилиндрическая спираль.
IAuxiliaryGeomContainer - Интерфейс контейнера объектов вспомогательной геометрии.

Всё это можно посмотреть в SDK, там же есть примеры библиотек.

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

Acabar

ispiral:= ksEntity(iPart.NewEntity(o3d_cylindricSpiral));

      if ispiral <> nil then
      begin
      ispiralDef := ksCylindricSpiralDefinition(ispiral.GetDefinition);
      if ispiralDef <> nil then
                  begin
      iPlaneEntity := ksEntity(iPart.GetDefaultEntity( o3d_planeYOZ ));
      ispiralDef.buildDir:=false;
      ispiralDef.buildMode:=1;
      ispiralDef.step:=H1;
      ispiralDef.height:=lrsv;
      ispiralDef.firstAngle:=omega;
      ispiral.Create;

      end;
      end;

Вот описал цилиндрическую спираль, при построении в компас она появляется в древе, но с восклицательным знаком. Подскажите в чём может быть проблема?

Acabar

 iPlaneEntity := ksEntity(iPart.GetDefaultEntity( o3d_planeYOZ )); заменить ispiralDef.SetPlane(iPlaneEntity); при этом iPlaneEntity должен быть описан iPlaneEntity := ksEntity(iPart.GetDefaultEntity( o3d_planeYOZ ));
Получилось самому разобраться.

Как минимум базовую плоскость установить ispiralDef.SetPlane(iPlaneEntity), а вообще можно нажать на появившейся спирали и посмотреть, что неверно.
+ Благодарностей: 1

Acabar

31.05.13, 20:07:04 #5 Последнее редактирование: 31.05.13, 20:20:39 от Acabar
ikinemDef.PathPartArray;
а вот теперь я совсем в ступоре. Метод по вырезанию кинематически в котором нужно указать массив траекторий(метод сверху получает получить этот массив), по которым будет вырезаться, а вот как правильно задать данный массив(траекторию для вырезания).?

31.05.13, 20:22:17 #6 Последнее редактирование: 31.05.13, 21:49:50 от Sabahs
Получить массив -> IEntityCollection:=ksEntityCollection(ICutEvolutionDefinition.PathPartArray)
добавить траекторию -> IEntityCollection.Add(ISpiral)
+ Благодарностей: 1

Acabar

Спасибо, все работает.

Acabar

Не получается скопировать по концентрической сетке, а именно указать массив тел для копирования и ось, объект в компасе создается но без массива тел и оси, а следовательно с восклицательным знаком.
       iaxis:= ksEntity(iPart.NewEntity(o3d_axisOX));//на эту строчку, говорит что ему не понятно o3d_axisOX, хотя взято это со списка(Идентификатор объекта 71)
                IEntityCollection.Clear;
                IEntityCollection:=ksEntityCollection(iCircularCopyDef.GetOperationArray);
                IEntityCollection.Add(ikinem);// с этой строчкой вообще не строит.
                iCircularCopyDef.SetAxis(iaxis); 

Вроде делал все по аналогии, но почему-то не получается.

Справка SDK:
ksCircularCopyDefinition::SetAxis - Установить ось копирования.
Синтаксис Automation: BOOL SetAxis(LPDISPATCH axis);
Входной параметр: axis - указатель на интерфейс оси ksEntity или IEntity.
У Вас iCircularCopyDef.SetAxis(o3d_axisOX);
Вы вообще разницу понимаете между o3d_axisOX и ksEntity?

iCircularCopyDef.SetAxis(ksEntity(IPart.GetDefaultEntity(o3d_axisOX)));

iaxis:= ksEntity(iPart.NewEntity(o3d_axisOX));  - всё правильно говорит ось уже существует по умолчанию.
+ Благодарностей: 1

Acabar

Цитата: Sabahs от 01.06.13, 13:45:12

iCircularCopyDef.SetAxis(ksEntity(IPart.GetDefaultEntity(o3d_axisOX)));

iaxis:= ksEntity(iPart.NewEntity(o3d_axisOX));  - всё правильно говорит ось уже существует по умолчанию.

Вылетает такая ошибка Undeclared identifier: 'o3d_axisOX'

Константа описана в LDefin3D.pas
+ Благодарностей: 1

Acabar

Да, действительно в моем файле он не был описан, взял файл с папки инклюд компаса там все норм. Все теперь получилось.

А параметры копирования Вы задали?
ksCircularCopyDefinition::SetCopyParamAlongDir
+ Благодарностей: 1

Acabar

Да, это по аналогии все получилось.

Acabar

Подскажите, можно ли как-то получить координаты последней точки винтовой линии методами SDK или ее нужно просчитывать математически.

Привести к ksCurve3D или ICurve3D и получить любую точку с помощью GetPoint.
Хотя посчитать математически будет быстрее.
+ Благодарностей: 1

Acabar

06.06.13, 02:09:31 #17 Последнее редактирование: 06.06.13, 02:54:21 от Acabar
isplineDef.AddVertex(xspiral_end, yspiral_end, zspiral_end, 1);
при построении в компасе останавливается на этой строчке и пишет "Недопустимое количество параметров"
xspiral_end, yspiral_end, zspiral_end:real; может из-за того что real, а не double;//проверил- нет
weight не знаю какой выставлять, когда вручную строю сплайн значение "---"
Также некоторые методы ksSplineDefinition, например задание опорной вершины вообще не опознаются.
Спасибо за помощь!

Типы переменных нужно использовать те, что прописаны в справке или в модулях.
Вы хотите поставить одну точку, если да то для этого нужно использовать интерфейс пространственной точки - IPoint3D.
Смотрите тему http://forum.ascon.ru/index.php/topic,24347.msg174446.html#msg174446

Acabar

Цитата: Sabahs от 07.05.13, 09:13:20
На Delphi:
Points3D:=ModelContainer.Points3D; // IPoints3D - Интерфейс коллекции элементов Пространственная точка
if Points3D<>nil then
begin
   Point3D:=Points3D.Add; // IPoint3D - Интерфейс пространственной точки
   if Point3D<>nil then
    begin
      Point3D.ParameterType:=ksPParamCoord; // По координатам от опорного объекта (начало координат)
      Point3D.X:=X;
      Point3D.Y:=Y;
      Point3D.Z:=Z;
      Point3D.Update;
    end;
end;
Задача создать сплайн, который далее будет использоваться как траектория, Points3D и сплайн похожие объекты, но все ровно не получается вызвать даже точку, как правильно описать Points3D используя Ipart7, если у меня есть
Kompas:= KompasObject( CreateOleObject('Kompas.Application.5') );
Doc:= ksDocument3D(Kompas.Document3D);

Тема помогла от части, т.к. не понял синтаксиса(C# из Visual Studio 2010) используемого языка программирования, но зато понял в каком направлении двигаться.