Как построить цилиндр по точкам из Visual Studio 2010

Автор realturik, 06.05.13, 16:25:00

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

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

realturik

Здравствуйте!

Есть задача программного построения цилиндра по трем точкам (для каждой из них известны 3 ее координаты):
Центр верхней грани
Центр нижней грани
Точка окружности верхней грани
Итого 9 чисел. При этом цилиндр расположен в пространстве произвольным образом.

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

Заранее спасибо за любые Ваши советы и примеры!

PS

Нужно сделать приблизительно следующее:
1. Создать три 3D точки.
2. Создать плоскость через вершину (точка центра верхней грани) перпендикулярно ребру (ось через точки центров верхней и нижней грани).
3. На созданной плоскости создать эскиз.
4. Спроектировать на эскиз точку центра верхней грани и точку на окружности.
5. Найти радиус окружности и построить окружность в эскизе.
6. Создать цилиндр с высотой до точки центра нижней грани.
+ Благодарностей: 1

denisvlpro

Построить по трём точкам возможно через переменные, а вот насчет программно, это вам  к Sabahs.
+ Благодарностей: 1

В общих чертах:
1. Строим 3 точки - IPoint3D
2. Строим ось через 2 вершины - IAxis2PointsDefinition
3. Строим плоскость проходящую через точку 3 и перпендикулярно оси - IPlanePerpendicularDefinition
4. На полученной плоскости строим эскиз - ISketchDefinition
- Получить проекцию точек 1 и 3 на плоскость - IPlacement.PointProjection
- Найти радиус по полученным координатам - DistancePntPnt
- Построить окружность по центру проекции точки 1 и найденному радиусу - Circle
5. Выдавить эскиз до точек 1 и 2 - IBaseExtrusionDefinition



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

realturik

Спасибо большое Sabahs, PS и denisvlpro! :o: Так здорово что есть люди, готовые помочь:)

Sabahs, спасибо за подробный план действий с названиями интерфейсов - очень поможет! Я вчера целый день строил IPoint3D так и не построил (построил контрольные или какие то другие точки, но точку в пространстве так и не смог). Если Вам не сложно, приведите пример кода, или описание действий по построению IPoint3D (может и базовые конечно действия, но я с Компасом очень мало работал). Заранее большое спасибо!

На 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;

realturik

а ModelContainer в первой строке кода - это что за класс или интерфейс?

IModelContainer - интерфейс контейнера трехмерных объектов, получаете от IPart7 - интерфейса компонента 3D документа.
+ Благодарностей: 1

realturik

Я создал объект компаса, создал новый документ, беру верхний компонент с документа, если он не существует беру через его свойство Parts коллекцию компонентов и создаю новый компонент. Создаю IModelContainer и пытаюсь получить его простым преобразованием IPart. Вставляю точку. Все проходит без ошибок, но точки в модели не появляется. Подскажите где я накосячил?

            IPart7 part = iDoc.TopPart;
            if (part == null)
            {
                part.Parts.get_Part((short)Part_Type.pNew_Part);
            }
            IModelContainer ModelContainer = (IModelContainer)part;
            IPoints3D Points3D = ModelContainer.Points3D;
            if (Points3D == null)
            {
                IPoint3D pnt = Points3D.Add();
                pnt.X = 1;
                pnt.Y = 2;
                pnt.Z = 20;
                pnt.Update();
            }

iDoc должен быть IKompasDocument3D.
Интерфейс Вы получили  IPart7 part = iDoc.TopPart; , зачем part.Parts.get_Part((short)Part_Type.pNew_Part);

IPart и IPart7 два разных интерфейса.

Цитироватьберу верхний компонент с документа, если он не существует беру через его свойство Parts
Не существовать, он не может.
+ Благодарностей: 1

realturik

iDoc как раз экземпляр IKompasDocument3D. Сначала я попробывал без строки part.Parts.get_Part((short)Part_Type.pNew_Part);
- ничего не строит. Думал если part не существует то его нужно создать. Вставил эту строку, но все равно не строит точку.
Я использую IPart7 везде - простите, описался
Я правильно получил IModelContainer в строке
                      IModelContainer ModelContainer = (IModelContainer)part;   
?

#11
Вроде правильно, я на Вашем языке не программирую и всех его тонкостей не знаю.
Проверьте все получаемые интерфейсы на  null и будете точно знать, где у Вас проблема. 
Если я правильно понял, то Вам нужно посмотреть примеры StepX_API7_3D из папки C:\Program Files\ASCON\KOMPAS-3D VXX\SDK\C#\Automation\
+ Благодарностей: 1

realturik

Большое спасибо, Sabahs! Точку поставил)
Приведу код, кому то может быть понадобиться, как мне:

Построение точки в трехмерном пространстве на C# из Visual Studio 2010:

Библиотеки: Kompas6Constants, KompasAPI7;

Код:
private IKompasDocument3D iDoc;
private IKompasAPIObject kompas;


private void LoadGrafic()
        {
            //Закгрузка графики API7
            if (kompas == null)
            {
                Type t = Type.GetTypeFromProgID("KOMPAS.Application.7");
                kompas = (IKompasAPIObject)Activator.CreateInstance(t);
            }

            if (kompas != null)
            {
                kompas.Application.Visible = true;
            }
        }

        private void NewFile()
        {
         
            //Новый файл API7
            if (kompas != null)
            {
                iDoc = (IKompasDocument3D)kompas.Application.Documents.AddWithDefaultSettings(Kompas6Constants.DocumentTypeEnum.ksDocumentPart, true);
            }
            else
            {
                MessageBox.Show("Объект не захвачен", "Ошибка");
            }
        }

        private void PutPoint(double x, double y, double z)
        {

            Part7 part = iDoc.TopPart;

            IModelContainer ModelContainer = (IModelContainer)part;
            IPoints3D Points3D = ModelContainer.Points3D;
            IPoint3D pnt = Points3D.Add();
            pnt.X = x;
            pnt.Y = y;
            pnt.Z = z;
            pnt.Symbol = ksAnnotationSymbolEnum.ksDotPoint;
            pnt.Update();

        }


Сейчас буду строить цилиндр - кодом поделюсь)

realturik

Sabahs, уповаю на Ваши знания API7) я рылся в примерах по построению IAxis2PointsDefinition, но все они для не для 7 версии API. Или для этого нужно использовать предыдущие версии API?
Если не сложно напишите код как бы Вы это сделали на паскале, я буду переводить на C#) Спасибо!)

Не обязательно создавать в API7.
Entity:=IEntity(Part.NewEntity(o3d_axis2Points)); // Part -IPart
if Entity<>nil then
begin // ось по двум точкам
   Axis2PointsDefinition:=IUnknown(Entity.GetDefinition) as IAxis2PointsDefinition;
   if Axis2PointsDefinition<>nil then
    begin
      if Entity_P1<>nil then Axis2PointsDefinition.SetPoint(Entity_P1,1);
      if Entity_P2<>nil then Axis2PointsDefinition.SetPoint(Entity_P2,2);
      Entity.Update;
    end;
end;
+ Благодарностей: 1

realturik

Спасибо, Sabahs!
А как мне у активного IKompasDocument3D который, как я понял поддерживается 7 версией API, получить интерфейс IPart?

Можно так, где Doc3D - IKompasDocument3D

Document3D:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(Doc3D),ksAPI3DCom,0)) as IDocument3D;
Part:=IPart(Document3D.GetPart(pTop_Part));

realturik

Sabahs, а как можно построить точку в пространстве используя API версии 5?

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

realturik

Цитата: Sabahs от 13.05.13, 11:56:31
Преобразовать  IPoint3D в ksVertexDefinition.

Нужно создать пустой iPoints3D, через его метод Add() создать IPoint3D, задать ей свойства, и преобразовать в ksVertexDefinition? но как мне его вставить в созданный для него ksEntity?
или может быть у Вас есть пример кода?