Отверстия на криволинейной поверхности под углом.

Автор graphdark, 05.07.21, 08:47:03

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

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

graphdark

Цитата: YNA от 07.07.21, 06:41:51- Сначала построить правильные отверстия без всяких смещений (что очень легко сделать)
- потом спроецировать центры этих отверстий на Плоскость под углом и измерить полученные размеры
- по измерениям составить корреляционные таблицы с допустимой погрешностью (для каждого угла наклона своя таблица) и пользоваться ими.
Я вчитался внимательнее и это, наверно, самое простое и очевидное решение. После построения отверстия производить измерение до точки центра элипса и вычитать из него ранее заданную координату. Благодарю за идею.

СВ

 Правильно ли понимаю ситуацию, что вы умеете программировать и при любой возможности стараетесь строить детали программным способом?
Или это нужно именно для этой детали, например - попасть точно в точку по координатам?

graphdark

Цитата: СВ от 07.07.21, 08:53:17Правильно ли понимаю ситуацию, что вы умеете программировать и при любой возможности стараетесь строить детали программным способом?
Автоматизирую то, что можно автоматизировать. Детали одни и те же с разными доработками. Автоматизирую эти самые доработки. И, естественно, что мне нужно как можно более простое построение. В данном конкретном случае конструктора сказали надо много отверстий в днище и не только прямых. Я решил эту задачу, но столкнулся с описанной проблемой. Как механик я в ужасе от таких хотелок. Без оснастки в покупной детали выполнять такие дыры, еще и под углом в 14ом квалитете. Да и с оснасткой, все равно ужас, а уж ОТК вовсе уволится когда эту деталь и чертеж увидит. Хорошо, что я программист и делаю то, что мне говорят.

СВ

#23
Цитата: graphdark от 07.07.21, 09:14:08Без оснастки в покупной детали выполнять такие дыры, еще и под углом в 14ом квалитете.
Они задают координаты в 14-м квалитете или размеры отверстий в 14-м? Сложно понять данную точность, исходя из того, что само днище очень неточное.
И почему не делают сами конструкторы, это же их работа?

YNA

Скорее всего нужна корреляция между размерами, показанными на рисунке.
Базовые размеры отверстий откладываются на наклонной плоскости и для каждого такого размера нужно найти свой коэффициент-множитель, чтобы получить размеры в плане равные 100 мм.
Или что то другое?

СВ

 А не проще ли вместо множества слов про "задание от конструкторов" увидеть один полноценный чертёж ...

Vitalij Lysanov

#26
Похоже что по отверстиям должно двигаться цилиндрическое и жестко закрепленное.
Например что-то двигать внутри. Это нужно четыре направляющие, и чтобы скользили.

Тогда нужны точные размеры между осями по нормали к осям.

И днище вроде как и не причем.
Чтобы днище было причем, это его нужно конкретно оцифровать и скорректировать точки.

Получается, просто сверлим отверстия в пространстве через все что попадется.

Есть агрегаты, правда специальные, так сразу выдают комплект отверстий с одного прохода.

__

Есть вариант, отверстие одно, цилиндр один, только потолще. Перемещения оси по углу можно убрать конструкцией снаружи, заодно можно и вращение внутри получить.
Квалитет?



__

Вначале был вектор в 3D, теперь эллипс на рисунках. Эллипс вроде считается по формулам, и это уже 2D
В 2D пересечения считаются, есть все готовое
 
 

СВ

А может быть это будут трубы вставлены ...

YNA

Цитата: Vitalij Lysanov от 07.07.21, 10:27:22Похоже что по отверстиям должно двигаться цилиндрическое и жестко закрепленное.
Например что-то двигать внутри. Это нужно четыре направляющие, и чтобы скользили.

Тогда нужны точные размеры между осями по нормали к осям.

И днище вроде как и не причем.
Чтобы днище было причем, это его нужно конкретно оцифровать и скорректировать точки.

Получается, просто сверлим отверстия в пространстве через все что попадется.

Есть агрегаты, правда специальные, так сразу выдают комплект отверстий с одного прохода.

__

Есть вариант, отверстие одно, цилиндр один, только потолще. Перемещения оси по углу можно убрать конструкцией снаружи, заодно можно и вращение внутри получить.
Квалитет?



__

Вначале был вектор в 3D, теперь эллипс на рисунках. Эллипс вроде считается по формулам, и это уже 2D
В 2D пересечения считаются, есть все готовое
 
 

"Простите, не понял, кто на ком стоял? Потрудитесь выражать ваши мысли яснее..."
Шутка, но с умыслом.  :cheesy:

Vitalij Lysanov

#29
Было предложение, чтобы чертеж приложили.
Это смотря что нужно.
Если автору непонятно что нужно, то минимум информации дает простор фантазии, и может что...

Просто с таким задание точности на отверстия, в них должно что-то двигаться.
Например, четыре штока, на которых жестко закреплена пластина.
Снаружи тоже пластина.
И все будет двигаться.

Есть вариант с одним отверстием побольше.
Шток побольше и та же пластина внутри.
Наклон оси штока убираем конструкцией снаружи.
Пластина еще может и вращаться.


_

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

_

Пересечение эллипса с прямой - это стандартная функция на Макро.

_

С Праздником!



 
__
P.S.

Что-то не пойму.
Вернемся к объемному варианту.

В горизонтальной плоскости стоим точку, из которой строим вектор, параметры вроде известны.

Зачем точка на поверхности?

Ломанную строим по параметрам векторов, и чтобы ломанная вышла за пределы поверхности.
Окружность кинематикой вырезает все что нужно вырезать.

Точки на поверхности не нужны - разметить по точкам нереально (для разметки все равно кондуктор нужен)
С кондуктора идет направление на неизвестную поверхность, кто может сказать, какие размеры этой точки.

Это с одной стороны точка, вторая точка тоже вроде нужна, дальше ...

__
Сверлить через кондуктор   
Точный контроль между осями по нормали к осям

Вячеслав

Цитата: СВ от 07.07.21, 10:20:27А не проще ли вместо множества слов про "задание от конструкторов" увидеть один полноценный чертёж ...

Ну оно конечно так, только это было бы так просто...
А так народ пишет тексты, догадки разные, эскизы, скриншоты. Весело же!

YNA

Понятное дело, если бы афтор выложил реальную проблему, то и тема бы умерла. А так всё прикольно, ни кто не знает о чём говорить, но тем не менее тема полезная и познавательная, есть над чем поглумиться.  :grin:

Vitalij Lysanov



Подробней:


Любой эскиз, любой вектор.


Сейчас эскиз один, векторов два.


Кинематика дает сечение по нормали к траектории.
Тут только расстояние по осям не равно расстоянию между центрами окружностей в эскизе. Что-то пересчитывать нужно.
Если одна окружность, она разворачивается по вектору и вырезает купол, только снова центр окружности пересчитывать нужно.
Вектор есть, в эскизе можно немного оперативно подвигать окружности. 




Рис   Виден эскиз и подсвечена одна группа отверстий.





Рис    Если превратить один из векторов почти в точку, будет совмещение с эскизом.



Рис    Тоже, второй вектор почти в точку. 




 
Рис  Эскиз. Два вектора. Две группы отверстий.


Чтобы не утруждаться, есть код:
Только если числа изменять, это нужно одновременно производить, т.к. например сама точка строится, и еще есть выход операции на эту точку.  Это на алгебру нужно переводить, для облегчения работы. 


# -*- coding: utf-8 -*-
#|купол2

import pythoncom
from win32com.client import Dispatch, gencache

import LDefin2D
import MiscellaneousHelpers as MH

#  Подключим константы API Компас
kompas6_constants = gencache.EnsureModule("{75C9F5D0-B5B8-4526-8681-9903C567D2ED}", 0, 1, 0).constants
kompas6_constants_3d = gencache.EnsureModule("{2CAF168C-7961-4B90-9DA2-701419BEEFE3}", 0, 1, 0).constants

#  Подключим описание интерфейсов API5
kompas6_api5_module = gencache.EnsureModule("{0422828C-F174-495E-AC5D-D31014DBBE87}", 0, 1, 0)
kompas_object = kompas6_api5_module.KompasObject(Dispatch("Kompas.Application.5")._oleobj_.QueryInterface(kompas6_api5_module.KompasObject.CLSID, pythoncom.IID_IDispatch))
MH.iKompasObject  = kompas_object

#  Подключим описание интерфейсов API7
kompas_api7_module = gencache.EnsureModule("{69AC2981-37C0-4379-84FD-5DD2F3C0A520}", 0, 1, 0)
application = kompas_api7_module.IApplication(Dispatch("Kompas.Application.7")._oleobj_.QueryInterface(kompas_api7_module.IApplication.CLSID, pythoncom.IID_IDispatch))
MH.iApplication  = application


Documents = application.Documents
#  Получим активный документ
kompas_document = application.ActiveDocument
kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

#  Создаем новый документ
kompas_document = Documents.AddWithDefaultSettings(kompas6_constants.ksDocumentPart, True)

kompas_document_3d = kompas_api7_module.IKompasDocument3D(kompas_document)
iDocument3D = kompas_object.ActiveDocument3D()

iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

iSketch = iPart.NewEntity(kompas6_constants_3d.o3d_sketch)
iDefinition = iSketch.GetDefinition()
iPlane = iPart.GetDefaultEntity(kompas6_constants_3d.o3d_planeYOZ)
iDefinition.SetPlane(iPlane)
iSketch.Create()
iDocument2D = iDefinition.BeginEdit()
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()

iEllipseParam = kompas6_api5_module.ksEllipseParam(kompas_object.GetParamStruct(kompas6_constants.ko_EllipseParam))
iEllipseParam.Init()
iEllipseParam.xc = 0
iEllipseParam.yc = 50
iEllipseParam.A = 49
iEllipseParam.B = 20
iEllipseParam.angle = 180
iEllipseParam.style = 1
obj1 = iDocument2D.ksEllipse(iEllipseParam)


iEllipsArcParam = kompas6_api5_module.ksEllipseArcParam(kompas_object.GetParamStruct(kompas6_constants.ko_EllipsArcParam))
iEllipsArcParam.Init()
iEllipsArcParam.xc = 0
iEllipsArcParam.yc = 50
iEllipsArcParam.A = 49
iEllipsArcParam.B = 20
iEllipsArcParam.angle = 180
iEllipsArcParam.angleFirst = 270
iEllipsArcParam.angleSecond = 360
iEllipsArcParam.direction = 1
iEllipsArcParam.style = 1
obj = iDocument2D.ksEllipseArc(iEllipsArcParam)
obj = iDocument2D.ksLineSeg(0, 0, 0, -60, 3)
iDocument2D.ksDeleteObj(obj1)


iDefinition.EndEdit()
iDocument2D.ksDeleteObj(obj1)





iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

obj = iPart.NewEntity(kompas6_constants_3d.o3d_bossRotated)
iDefinition = obj.GetDefinition()
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
iCollection.SelectByPoint(0, 30, 0)
iEdge = iCollection.Last()
iEdgeDefinition = iEdge.GetDefinition()
iSketch = iEdgeDefinition.GetOwnerEntity()
iDefinition.SetSketch(iSketch)
iRotatedParam = iDefinition.RotatedParam()
iRotatedParam.direction = kompas6_constants_3d.dtNormal
iRotatedParam.angleNormal = 360
iRotatedParam.angleReverse = 0
iRotatedParam.toroidShape = True
iRotated = kompas_object.TransferInterface(obj, kompas6_constants.ksAPI7Dual, 0)
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
iCollection.SelectByPoint(0, -70, 0)
iEdge = iCollection.Last()
iRotatedAxis = kompas_object.TransferInterface(iEdge, kompas6_constants.ksAPI7Dual, 0)
iRotated.Axis = iRotatedAxis
iThinParam = iDefinition.ThinParam()
iThinParam.thin = True
iThinParam.thinType = kompas6_constants_3d.dtMiddlePlane
iThinParam.normalThickness = 7
iThinParam.reverseThickness = 0
obj.name = "Элемент вращения:1"
iColorParam = obj.ColorParam()
iColorParam.ambient = 0.5
iColorParam.color = 9474192
iColorParam.diffuse = 0.6
iColorParam.emission = 0.5
iColorParam.shininess = 0.8
iColorParam.specularity = 0.8
iColorParam.transparency = 1
obj.Create()





















iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

iSketch = iPart.NewEntity(kompas6_constants_3d.o3d_sketch)
iDefinition = iSketch.GetDefinition()
iPlane = iPart.GetDefaultEntity(kompas6_constants_3d.o3d_planeXOZ)
iDefinition.SetPlane(iPlane)
iSketch.Create()
iDocument2D = iDefinition.BeginEdit()
kompas_document_2d = kompas_api7_module.IKompasDocument2D(kompas_document)
iDocument2D = kompas_object.ActiveDocument2D()

obj = iDocument2D.ksCircle(-10,     -20,    4, 1)
obj = iDocument2D.ksCircle(10,      -20,    4, 1)
obj = iDocument2D.ksCircle(-10,     -7,     4, 1)
obj = iDocument2D.ksCircle(10,      -7,     4, 1)
iDefinition.EndEdit()



iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)
iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)
iPoints3D = iModelContainer.Points3D
iPoint3D = iPoints3D.Add()
iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord
iPoint3D.Symbol = kompas6_constants.ksDotPoint
iPoint3D.X = 0
iPoint3D.Y = 0
iPoint3D.Z = 0
iPoint = iPart.GetDefaultEntity(kompas6_constants_3d.o3d_pointCS)
iPoint7 = kompas_object.TransferInterface(iPoint, kompas6_constants.ksAPI7Dual, 0)
iPoint3D.SetAssociationObject(iPoint7)
iPoint3D.Update()





iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)
iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)
iPoints3D = iModelContainer.Points3D
iPoint3D = iPoints3D.Add()
iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord
iPoint3D.Symbol = kompas6_constants.ksDotPoint
iPoint3D.X = 0
iPoint3D.Y = 0
iPoint3D.Z = 0
iPoint = iPart.GetDefaultEntity(kompas6_constants_3d.o3d_pointCS)
iPoint7 = kompas_object.TransferInterface(iPoint, kompas6_constants.ksAPI7Dual, 0)
iPoint3D.SetAssociationObject(iPoint7)
iPoint3D.Update()

iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)
iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)
iPoints3D = iModelContainer.Points3D
iPoint3D = iPoints3D.Add()
iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord
iPoint3D.Symbol = kompas6_constants.ksDotPoint
iPoint3D.X = 0
iPoint3D.Y = 0
iPoint3D.Z = 0
iPoint3D.Update()

iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)
iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)
iPoints3D = iModelContainer.Points3D
iPoint3D = iPoints3D.Add()
iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord
iPoint3D.Symbol = kompas6_constants.ksDotPoint
iPoint3D.X = 11
iPoint3D.Y = -222
iPoint3D.Z = 22
iPoint3D.Update()


iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)
iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)
iPoints3D = iModelContainer.Points3D
iPoint3D = iPoints3D.Add()
iPoint3D.ParameterType = kompas6_constants_3d.ksPParamCoord
iPoint3D.Symbol = kompas6_constants.ksDotPoint
iPoint3D.X = -22
iPoint3D.Y = -222
iPoint3D.Z = -55
iPoint3D.Update()

iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

iAuxiliaryGeomContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IAuxiliaryGeomContainer.CLSID, pythoncom.IID_IDispatch)
iAuxiliaryGeomContainer = kompas_api7_module.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
iLineSegment3D = iLineSegments3D.Add()
iLineSegment3D.BuildingType = kompas6_constants_3d.ksLSTTwoPoints
iLineSegment3D.SetPoint(True, 0, 0, 0)
iLineSegment3D.SetPoint(False, 11, -222, 22)
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_point3D)
iCollection.SelectByPoint(0, 0, 0)
iPoint = iCollection.First()
iPoint7 = kompas_object.TransferInterface(iPoint, kompas6_constants.ksAPI7Dual, 0)
iLineSegment3D.SetAssociationObject(True, iPoint7)
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_point3D)
iCollection.SelectByPoint(11, -222, 22)
iPoint = iCollection.First()
iPoint7 = kompas_object.TransferInterface(iPoint, kompas6_constants.ksAPI7Dual, 0)
iLineSegment3D.SetAssociationObject(False, iPoint7)
iLineSegment3D.SetPointType(True, kompas6_constants_3d.ksPParamCoord)
iLineSegment3D.SetPointType(False, kompas6_constants_3d.ksPParamCoord)
iParameters = iLineSegment3D.PointParameters(True)
iParameters = iLineSegment3D.PointParameters(False)
iLineSegment3D.Update()


iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

iAuxiliaryGeomContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IAuxiliaryGeomContainer.CLSID, pythoncom.IID_IDispatch)
iAuxiliaryGeomContainer = kompas_api7_module.IAuxiliaryGeomContainer(iAuxiliaryGeomContainer)
iLineSegments3D = iAuxiliaryGeomContainer.LineSegments3D
iLineSegment3D = iLineSegments3D.Add()
iLineSegment3D.BuildingType = kompas6_constants_3d.ksLSTTwoPoints
iLineSegment3D.SetPoint(True, 0, 0, 0)
iLineSegment3D.SetPoint(False, -22, -222, -55)
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_point3D)
iCollection.SelectByPoint(0, 0, 0)
iPoint = iCollection.First()
iPoint7 = kompas_object.TransferInterface(iPoint, kompas6_constants.ksAPI7Dual, 0)
iLineSegment3D.SetAssociationObject(True, iPoint7)
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_point3D)
iCollection.SelectByPoint(-22, -222, -55)
iPoint = iCollection.First()
iPoint7 = kompas_object.TransferInterface(iPoint, kompas6_constants.ksAPI7Dual, 0)
iLineSegment3D.SetAssociationObject(False, iPoint7)
iLineSegment3D.SetPointType(True, kompas6_constants_3d.ksPParamCoord)
iLineSegment3D.SetPointType(False, kompas6_constants_3d.ksPParamCoord)
iParameters = iLineSegment3D.PointParameters(True)
iParameters = iLineSegment3D.PointParameters(False)
iLineSegment3D.Update()





iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

obj = iPart.NewEntity(kompas6_constants_3d.o3d_cutEvolution)
iDefinition = obj.GetDefinition()
iDefinition.cut = True
iDefinition.cut = 2
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
iCollection.SelectByPoint(-10, 0, 24)
iEdge = iCollection.Last()
iEdgeDefinition = iEdge.GetDefinition()
iSketch = iEdgeDefinition.GetOwnerEntity()
iDefinition.SetSketch(iSketch)
iArray = iDefinition.PathPartArray()
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
iCollection.SelectByPoint(11/2, -222/2, 22/2)
iCurve = iCollection.Last()
iArray.Add(iCurve)
iThinParam = iDefinition.ThinParam()
iThinParam.thin = False
obj.name = "Элемент по траектории:1"
iColorParam = obj.ColorParam()
iColorParam.ambient = 0.5
iColorParam.color = 9474192
iColorParam.diffuse = 0.6
iColorParam.emission = 0.5
iColorParam.shininess = 0.8
iColorParam.specularity = 0.8
iColorParam.transparency = 1
obj.Create()
iPart7 = kompas_document_3d.TopPart
iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

obj = iPart.NewEntity(kompas6_constants_3d.o3d_cutEvolution)
iDefinition = obj.GetDefinition()
iDefinition.cut = True
iDefinition.cut = 2
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
iCollection.SelectByPoint(-10, 0, 24)
iEdge = iCollection.Last()
iEdgeDefinition = iEdge.GetDefinition()
iSketch = iEdgeDefinition.GetOwnerEntity()
iDefinition.SetSketch(iSketch)
iArray = iDefinition.PathPartArray()
iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
iCollection.SelectByPoint(-22/2, -222/2, -55/2)
iCurve = iCollection.Last()
iArray.Add(iCurve)
iThinParam = iDefinition.ThinParam()
iThinParam.thin = False
obj.name = "Элемент по траектории:1"
iColorParam = obj.ColorParam()
iColorParam.ambient = 0.5
iColorParam.color = 9474192
iColorParam.diffuse = 0.6
iColorParam.emission = 0.5
iColorParam.shininess = 0.8
iColorParam.specularity = 0.8
iColorParam.transparency = 1
obj.Create()



Vitalij Lysanov

Случайно затесалась дезинформация.
Поэтому корректируем.

Есть, в Компас 19 программное построение точки пересечения отрезка и поверхности.





Точки на поверхности для возможной разметки

Расстояние между осями отверстий, взятое по нормали - не равно расстоянию между окружностями в эскизе.
 
Есть вариант построения с эскизом на повернутой плоскости.
Это много эскизов и все равно придется координаты пересчитывать в систему эскиза.

Пока все в одной системе, и вектора удобно складывать для получения точки встречи осей отверстий с поверхностями.

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

  


Рис     Окружности в эскизе. Видны определяющие направление вектора и точки пересечения с поверхностями.

Сама функция приведена ниже.
Как обычно для выхода на выхода на вектор ищем середину вектора. Это все делается для исключения неоднозначности при поиске например отрезков по их уравнениям. Если точка подойдет для двух уравнений, все становится непонятным.

Можно взять точку на эллипсе не на осях (одну координату ставим ноль ), но тут других построений нет, берем просто точки на осях.  

#_____________________________________________________________
def Точка_на_пересечении(t1,t2):

    iPart7 = kompas_document_3d.TopPart
    iPart = iDocument3D.GetPart(kompas6_constants_3d.pTop_Part)

    iModelContainer = iPart7._oleobj_.QueryInterface(kompas_api7_module.IModelContainer.CLSID, pythoncom.IID_IDispatch)
    iModelContainer = kompas_api7_module.IModelContainer(iModelContainer)
    iPoints3D = iModelContainer.Points3D
    iPoint3D = iPoints3D.Add()

    iPoint3D.ParameterType = kompas6_constants_3d.ksPIntersect
    iPoint3D.Symbol = kompas6_constants.ksDotPoint
    iParameters = iPoint3D.Parameters
    iPoint3DParamIntersect = iParameters._oleobj_.QueryInterface(kompas_api7_module.IPoint3DParamIntersect.CLSID, pythoncom.IID_IDispatch)
    iPoint3DParamIntersect = kompas_api7_module.IPoint3DParamIntersect(iPoint3DParamIntersect)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_edge)
    iCollection.SelectByPoint(t1[0], t1[1], t1[2])

    iEdge = iCollection.Last()
    iCurveObject = kompas_object.TransferInterface(iEdge, kompas6_constants.ksAPI7Dual, 0)
    iPoint3DParamIntersect.SetCurveObject(iCurveObject)
    iCollection = iPart.EntityCollection(kompas6_constants_3d.o3d_face)
    iCollection.SelectByPoint(t2[0], t2[1], t2[2])
    iFace = iCollection.First()

    iSurfaceObject = kompas_object.TransferInterface(iFace, kompas6_constants.ksAPI7Dual, 0)
    iPoint3DParamIntersect.SetSurfaceObject(iSurfaceObject)
    iPoint3D.Update()
#_____________________________________________________________

Вызов функции:
Точка_на_пересечении(центр_окр1+t3/2,tb)
Точка_на_пересечении(центр_окр1+t3/2,tm)

где:
центр_окр1+t3/2    -  точка в центре вектора.
tb, tm                      -   точки на наружной и внутренней поверхностях.


Полностью текст:
https://docs.google.com/document/d/11Q_-t7bZfC3kn1wrS8EirCxivhkKOL3LN6ChLKFhrIc/edit?usp=sharing

             

graphdark

Может кому понадобится, решение на delphi выложил в этой теме. https://forum.ascon.ru/index.php?topic=35841.0 Там же расписал алгоритм.