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

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

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

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

Не проще сразу получить у IPoint3D его IEntity.
ModelObject:=Point3D as IModelObject;
if ModelObject<>nil then Entity:=IUnknown(ksTransferInterface(LtDefine.PIUnknown(ModelObject.Owner),ksAPI3DCom,o3d_entity)) as IEntity;
+ Благодарностей: 1

realturik

Ух)) почти все сделал!)
Sabahs, думаю это будет последний мой вопрос Вам, спасибо за Вашу огромную помощь!

как начало координат для ksSketchDefinition передвинуть в имеющуюся в модели точку, принадлежащей плоскости эскиза?

Использовать плоскость для эскиза проходящую через точку, как оптимальный вариант, создать локальную систему координат (ILocalCoordinateSystem) с началом в точке и нужной ориентацией, а у неё уже есть целых три плоскости по умолчанию.

realturik

Цитата: Sabahs от 14.05.13, 09:22:57
Использовать плоскость для эскиза проходящую через точку, как оптимальный вариант, создать локальную систему координат (ILocalCoordinateSystem) с началом в точке и нужной ориентацией, а у неё уже есть целых три плоскости по умолчанию.

Дело в том что плоскость я уже создал - мне только нужно чтобы начало координат на для ksSketchDefinition на этой плоскости было в точке, которая в модели построена уже, и которая принадлежит этой плоскости

Тогда создать матрицу преобразования координат - Mtr, а затем после построения не забыть отменить - DeleteMtr.
+ Благодарностей: 1

realturik

а как можно работать с результатом работы функции ksSketchDefinition.AddProjectionOf() - если я отправлю ей свою точку как аргумент она вернет int-овый указатель на объект проекции - можно ли узнать координаты этой проекции?

Вернёт указатель на группу объектов, получившихся в результате проецирования, в Вашем случае там будет один объект точка, а из группы вытягиваете указатель на интерфейс точки и считываете значения координат.
+ Благодарностей: 1

realturik

Цитата: Sabahs от 14.05.13, 10:29:14
Вернёт указатель на группу объектов, получившихся в результате проецирования, в Вашем случае там будет один объект точка, а из группы вытягиваете указатель на интерфейс точки и считываете значения координат.

как устроен этот механизм "вытягивания"? как из целогочисленного указателя получить объект? есть ли у вас пример кода?

А примеры в SDK для кого?
Смотрите step7 и step3.
Для API5 GetObjParam
Для API7 через вариантные массивы


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

realturik

Большое спасибо, Sabahs! Благодаря Вам у меня все получилось!)

Возможно кому то пригодиться - здесь функции для создания цилиндра по трем точкам с помощью C#


private void LoadGrafic()
        {
            //Загрузка графики API5
            if (kompas == null)
            {

                Type t = Type.GetTypeFromProgID("KOMPAS.Application.5");
                kompas = (KompasObject)Activator.CreateInstance(t);
            }

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

        private void NewFile()
        {
            //Новый файл API5
            if (kompas != null)
            {
                doc = (ksDocument3D)kompas.Document3D();
                doc.Create();
            }
            else
            {
                MessageBox.Show("Объект не захвачен", "Ошибка");
            }
        }

        private object PutPoint(double x, double y, double z)
        {
            ksPart part = (ksPart)doc.GetPart((short)Part_Type.pNew_Part);   // новый компонент
            Part7 part7 = (Part7)kompas.TransferInterface(part, (int)ksAPITypeEnum.ksAPI7Dual, (int)Obj3dType.o3d_part);
            IModelContainer ModelContainer = (IModelContainer)part7;
            IPoints3D Points3D = ModelContainer.Points3D;

            IPoint3D pnt0 = Points3D.Add();
            pnt0.X = x;
            pnt0.Y = y;
            pnt0.Z = z;
            pnt0.Symbol = ksAnnotationSymbolEnum.ksDotPoint;
            pnt0.Update();
            ksEntity entity = kompas.TransferInterface(pnt0, (int)ksAPITypeEnum.ksAPI5Auto, (int)Obj3dType.o3d_entity);

            return (entity);
        }

        private ksEntity Axis2Point(object entity1, object entity2)
        {
            ksPart part = (ksPart)doc.GetPart((short)Part_Type.pNew_Part);   // новый компонент

            // создадим ось по двум точкам
            ksEntity entityAxis2Point = (ksEntity)part.NewEntity((short)Obj3dType.o3d_axis2Points);
            ksAxis2PointsDefinition axis2Point = (ksAxis2PointsDefinition)entityAxis2Point.GetDefinition();
            axis2Point.SetPoint(1, entity1);
            axis2Point.SetPoint(2, entity2);
            entityAxis2Point.Create();
            return (entityAxis2Point);
        }

        private ksEntity PlanePerpendicular(ksEntity Axis, object Point)
        {
            ksPart part = (ksPart)doc.GetPart((short)Part_Type.pNew_Part);   // новый компонент

            //создадим плоскость перпендикулярно
            ksEntity entityPlane = (ksEntity)part.NewEntity((short)Obj3dType.o3d_planePerpendicular);
            ksPlanePerpendicularDefinition plane = entityPlane.GetDefinition();
            plane.SetEdge(Axis);
            plane.SetPoint(Point);
            entityPlane.Create();
            return (entityPlane);
        }

        private object Circle(ksEntity Plane, object pnt, double dPDC)
        {
            ksPart part = (ksPart)doc.GetPart((short)Part_Type.pNew_Part);   // новый компонент

            ksEntity entitySketch = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch);

            // интерфейс свойств эскиза
            ksSketchDefinition sketchDef = (ksSketchDefinition)entitySketch.GetDefinition();
            sketchDef.SetPlane(Plane);

            entitySketch.Create();
           
            ksDocument2D sketchEdit = (ksDocument2D)sketchDef.BeginEdit();

            //Чтобы определить центр отверстия, спроецируем точку на плоскость эскиза, возьмем первый элемент по полученному указателю и используем его параметры как центр для окружности
            Int32 Proj = sketchDef.AddProjectionOf(pnt);
            ksPointParam par=(ksPointParam)kompas.GetParamStruct((short)StructType2DEnum.ko_PointParam);
            Int32 projPoint=0;
            ksIterator iter = (ksIterator)kompas.GetIterator();
         if (iter.ksCreateIterator(ldefin2d.ALL_OBJ, Proj))
         {
                projPoint = iter.ksMoveIterator("F");
            }

            sketchEdit.ksGetObjParam(projPoint, par, ldefin2d.ALLPARAM);
           
            sketchEdit.ksCircle(par.x, par.y, dPDC/2, 1);
            sketchDef.EndEdit();         // завершение редактирования эскиза

            return (entitySketch);
        }

        private void Extrusion(object skatch, double h)
        {
            ksPart part = (ksPart)doc.GetPart((short)Part_Type.pNew_Part);   // новый компонент
            ksEntity entityExtr = (ksEntity)part.NewEntity((short)Obj3dType.o3d_baseExtrusion);
            if (entityExtr != null)
            {
                // интерфейс свойств базовой операции выдавливания
                ksBaseExtrusionDefinition extrusionDef = (ksBaseExtrusionDefinition)entityExtr.GetDefinition();   // интерфейс базовой операции выдавливания
                if (extrusionDef != null)
                {
                    extrusionDef.directionType = (short)Direction_Type.dtNormal;         // направление выдавливания
                    extrusionDef.SetSideParam(true /*прямое направление*/, (short)End_Type.etBlind /*строго на глубину*/, h, 0, false);
                    extrusionDef.SetSketch(skatch);                           // эскиз операции выдавливания
                    entityExtr.Create();                                       // создать операцию
                }
            }
        }