При выборе стандартной резьбы в свойствах отображается нестандартная

Автор maksim krotov, 04.11.25, 10:54:05

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

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

maksim krotov

Написал я следующий код:

 IApplication application = Marshal.GetActiveObject("KOMPAS.Application.7") as IApplication;
 IPartDocument partDoc = (IPartDocument)application.Documents.Add(Kompas6Constants.DocumentTypeEnum.ksDocumentPart);

 Part7 part = partDoc.TopPart;
 IModelContainer modelContainer = (IModelContainer)part;

 Sketch sketch = modelContainer.Sketchs.Add();
 sketch.Plane = part.DefaultObject[ksObj3dTypeEnum.o3d_planeXOY];
 sketch.Update();

 IKompasDocument2D document2D = sketch.BeginEdit();

 IViewsAndLayersManager viewsAndLayersManager = document2D.ViewsAndLayersManager;
 IView view = viewsAndLayersManager.Views.ActiveView;
 IDrawingContainer drawingContainer = (IDrawingContainer)view;

 ICircle circle = drawingContainer.Circles.Add();
 circle.Xc = 0;
 circle.Yc = 0;
 circle.Radius = 200;
 circle.Update();

 IPoint point = drawingContainer.Points.Add();
 point.X = 0;
 point.Y = 1;
 point.Update();

 sketch.EndEdit();

 IExtrusion extrusion = modelContainer.Extrusions.Add(ksObj3dTypeEnum.o3d_bossExtrusion);
 extrusion.Sketch = sketch;
 extrusion.Depth[true] = 20;
 extrusion.Update();

 IVertex vertex = null;

 object[] vertices = modelContainer.Objects[ksObj3dTypeEnum.o3d_vertex];
 foreach(object obj in vertices )
 {
     if (obj is IVertex v)
     {
         v.GetPoint(out double x, out double y, out double z);

         if (x == 0  && y == 0 && z == 0)
         {
             vertex = v;

             break;
         }
     }
 }

 object[] faces = modelContainer.Objects[ksObj3dTypeEnum.o3d_face];
 IFace face = null;
 foreach (var obj in faces)
 {
     if (obj is IFace f)
     {
        if (f.IsPlanar)
        {
             IEdge e = f.LimitingEdges;

             e.GetPoint(true, out double x, out double y, out double z);

             if (x == 200 && y == 0 && z == 0)
             {
                 face = f;

                 break;
             }
        }
     }
 }

 IApplicationDialogs applicationDialogs = application as IApplicationDialogs;

 IThreadDialogParam threadDialog = applicationDialogs.GetDialogParam(KompasAPIObjectTypeEnum.ksObjectThreadDialogParam) as IThreadDialogParam;

 IDocumentFrame documentFrame = partDoc.DocumentFrames[0];

 applicationDialogs.SelectThread(documentFrame.GetHWND(), threadDialog as ThreadDialogParam);


 IHole3D hole = modelContainer.Holes3D.Add();
 hole.ShowThread = true;

 IHoleDisposal holeDisposal = hole as IHoleDisposal;
 holeDisposal.AssociationVertex = vertex;
 holeDisposal.BaseSurface = face;

 IThread thread = hole.Thread;
 thread.AutoLenght = true;

 IThreadsParameters threadsParameters = thread as IThreadsParameters;
 threadsParameters.Init(threadDialog.Standart, threadDialog.NominalDiameter, threadDialog.P);

 thread.Update();

 

 hole.Update();

Программа сперва создает диск, затем вызывает диалоговое окно для выбора резьб. Пользователь выбирает резьбу (например, Метрическую резьбу с крупным шагом ГОСТ 24705-2004, номильнальный диаметр 11 мм, шаг 1.5), нажимает на кнопку "выбрать", после чего программа создает простое отверстие с резьбой. Но если зайти в свойства отверстия, то там будет написано, что резьба нестандартная, хотя в коде был вызван метод Init, который, согласно документации https://help.ascon.ru/KOMPAS_SDK/23/ru-RU/ithreadsparameters_init.html, инициализирует параметры стандартной резьбы.

Miroshnyk

Цитата: maksim krotov от 04.11.25, 10:54:05...
хотя в коде был вызван метод Init, который, согласно документации https://help.ascon.ru/KOMPAS_SDK/23/ru-RU/ithreadsparameters_init.html, инициализирует параметры стандартной резьбы.
Он инициализирует объект, т.е. обнуляет все параметры, а то, что нужно поменять в этих параметрах, делаете Вы.

maksim krotov

Но ведь иными способами задать стандарт резьбы вроде нельзя (по крайней мере у интерфейса IThreadsParameters свойство ThreadStandardFileName только для чтения).