/// <summary> /// Нарисовать внутреннее скругление шайбы /// </summary> /// <param name="shimSettings">Параметры шайбы</param> /// <param name="shimEdit">Чертеж</param> private static void DrawShimInnerFillet(ShimSettings shimSettings, ksDocument2D shimEdit) { if (shimSettings.InnerFillet > 0) { shimEdit.ksArcByPoint( shimSettings.InnerRadius + shimSettings.InnerFillet, shimSettings.Height / 2 - shimSettings.InnerFillet, shimSettings.InnerFillet, shimSettings.InnerRadius + shimSettings.InnerFillet, shimSettings.Height / 2, shimSettings.InnerRadius, shimSettings.Height / 2 - shimSettings.InnerFillet, 1, 1); } if (shimSettings.InnerFillet != shimSettings.Height / 2) { shimEdit.ksLineSeg(shimSettings.InnerRadius, shimSettings.Height / 2 - shimSettings.InnerFillet, shimSettings.InnerRadius, -shimSettings.Height / 2 + shimSettings.InnerFillet, 1); } if (shimSettings.InnerFillet > 0) { shimEdit.ksArcByPoint( shimSettings.InnerRadius + shimSettings.InnerFillet, -shimSettings.Height / 2 + shimSettings.InnerFillet, shimSettings.InnerFillet, shimSettings.InnerRadius + shimSettings.InnerFillet, -shimSettings.Height / 2, shimSettings.InnerRadius, -shimSettings.Height / 2 + shimSettings.InnerFillet, -1, 1); } }
/// <summary> /// Создание модели шестерни /// </summary> /// <param name="properties">Передаваемые с формы параметры</param> public void CreateModel(Gear properties) { int teethCount = properties.TeethCount; var angle = properties.Angle; var thickness = properties.Thickness; var shaftDiam = properties.ShaftDiam; var diameterOut = properties.DiameterOut; var diameterIn = properties.DiameterIn; var diameterPitch = (diameterOut + diameterIn) / 2; // делительный диаметр колеса var alfa1 = 0.0; var alfa2 = 0.0; // интерфейсы ортогональных плоскостей ksPart iPart = _doc3.GetPart((int)Part_Type.pNew_Part) as ksPart; //новый компонет if (iPart != null) { // интерфейсы ортогональных плоскостей ksEntity planeXoy = iPart.GetDefaultEntity((short)Obj3dType.o3d_planeXOY) as ksEntity; ksEntity planeXoz = iPart.GetDefaultEntity((short)Obj3dType.o3d_planeXOZ) as ksEntity; ksEntity planeYoz = iPart.GetDefaultEntity((short)Obj3dType.o3d_planeYOZ) as ksEntity; // интерфейс эскиза (половина контура сечения колеса) ksEntity iSketchEntity = iPart.NewEntity((short)Obj3dType.o3d_sketch) as ksEntity; if (iSketchEntity != null) { // интерфейс параметров эскиза ksSketchDefinition iSketchDef = iSketchEntity.GetDefinition() as ksSketchDefinition; if (iSketchDef != null) { if (planeXoy != null) { // устанавливаем плоскость, // на которой создается эскиз iSketchDef.SetPlane(planeXoy); iSketchEntity.Create(); // запускаем процесс редактирования эскиза // doc – указатель на интерфейс ksDocument2D _doc = iSketchDef.BeginEdit() as ksDocument2D; if (_doc != null) { _doc.ksLineSeg(-thickness / 2, 00, thickness / 2, 0, 3); //3 - осевая линия _doc.ksLineSeg(thickness / 2, shaftDiam / 2, -thickness / 2, shaftDiam / 2, 1); _doc.ksLineSeg(thickness / 2, shaftDiam / 2, thickness / 2, diameterOut / 2, 1); _doc.ksLineSeg(-thickness / 2, diameterOut / 2, -thickness / 2, shaftDiam / 2, 1); _doc.ksLineSeg(-thickness / 2, diameterOut / 2, thickness / 2, diameterOut / 2, 1); } iSketchDef.EndEdit(); } } } // интерфейс базовой операции вращения ksEntity iBaseRotatedEntity = iPart.NewEntity((short)Obj3dType.o3d_baseRotated) as ksEntity; if (iBaseRotatedEntity != null) { // интерфейс параметров вращения ksBaseRotatedDefinition iBaseRotatedDef = iBaseRotatedEntity.GetDefinition() as ksBaseRotatedDefinition; if (iBaseRotatedDef != null) { // настройка параметров вращения iBaseRotatedDef.SetThinParam(false, (short)Direction_Type.dtNormal, 1, 1); iBaseRotatedDef.SetSideParam(true, 360.0); iBaseRotatedDef.toroidShapeType = false; iBaseRotatedDef.SetSketch(iSketchEntity); // создаем операцию вращения // результат – заготовка зубчатого колеса iBaseRotatedEntity.Create(); } } ksEntity iSketch1Entity = iPart.NewEntity((short)Obj3dType.o3d_sketch) as ksEntity; if (iSketch1Entity != null) { ksSketchDefinition iSketch1Def = iSketch1Entity.GetDefinition() as ksSketchDefinition; if (iSketch1Def != null) { if (planeYoz != null) { // размещаем эскиз на плоскости XOY iSketch1Def.SetPlane(planeXoy); iSketch1Entity.Create(); _doc = iSketch1Def.BeginEdit() as ksDocument2D; if (_doc != null) { var width = properties.KeywayWidth; _doc.ksLineSeg(thickness / 2, -width / 2, -thickness / 2, -width / 2, 1); _doc.ksLineSeg(-thickness / 2, width / 2, -thickness / 2, -width / 2, 1); _doc.ksLineSeg(-thickness / 2, width / 2, thickness / 2, width / 2, 1); _doc.ksLineSeg(thickness / 2, width / 2, thickness / 2, -width / 2, 1); } iSketch1Def.EndEdit(); } } } // интерфейс операции Вырезать выдавливанием ksEntity iCutExtrusion = iPart.NewEntity((short)Obj3dType.o3d_cutExtrusion) as ksEntity; if (iCutExtrusion != null) { // интерфейс параметров вырезания ksCutExtrusionDefinition iCutExtrusionDef = iCutExtrusion.GetDefinition() as ksCutExtrusionDefinition; if (iCutExtrusionDef != null) { // настройка параметров iCutExtrusionDef.SetSketch(iSketch1Entity); // направление iCutExtrusionDef.directionType = (short)Direction_Type.dtNormal; // величина вырезания по каждому из направлений iCutExtrusionDef.SetSideParam(true, (short)ksEndTypeEnum.etBlind, properties.KeywayDepth + shaftDiam / 2, 0, false); iCutExtrusionDef.SetThinParam(false, 0, 0, 0); iCutExtrusion.Create(); } } // интерфейс смещенной плоскости ksEntity iOffsetPlaneEntity = iPart.NewEntity((short)Obj3dType.o3d_planeOffset) as ksEntity; if (iOffsetPlaneEntity != null) { // интерфейс параметров смещенной плоскости ksPlaneOffsetDefinition iOffsetPlaneDef = iOffsetPlaneEntity.GetDefinition() as ksPlaneOffsetDefinition; if (iOffsetPlaneDef != null) { // величина, базовая плоскость и другие параметры смещения iOffsetPlaneDef.offset = thickness / 2; iOffsetPlaneDef.SetPlane(planeYoz); iOffsetPlaneDef.direction = false; // делаем плоскость скрытой iOffsetPlaneEntity.hidden = true; // создаем вспомогательную плоскость iOffsetPlaneEntity.Create(); } } // эскиз первого выреза между зубьями ksEntity iSketch2Entity = iPart.NewEntity((short)Obj3dType.o3d_sketch) as ksEntity; if (iSketch2Entity != null) { ksSketchDefinition iSketch2Def = iSketch2Entity.GetDefinition() as ksSketchDefinition; if (iSketch2Def != null) { // базовая плоскость – вспомогательная iOffsetPlaneEntity iSketch2Def.SetPlane(iOffsetPlaneEntity); iSketch2Entity.Create(); _doc = iSketch2Def.BeginEdit() as ksDocument2D; alfa1 = 360.0 / teethCount; _doc.ksMtr(0, 0, 90, 1, 1); // вычерчивание изображения эскиза // вместо эвольвент для простоты // берем обычные дуги по трем точкам _doc.ksArcBy3Points(-(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(0)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(0)), -diameterPitch / 2 * Math.Sin(DegToRad(alfa1 / 8)), -diameterPitch / 2 * Math.Cos(DegToRad(alfa1 / 8)), -diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 4)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 4)), 1); _doc.ksArcByPoint(0, 0, diameterIn / 2, -diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 4)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 4)), -diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 2)), -1, 1); _doc.ksArcBy3Points(-diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 2)), -diameterPitch / 2 * Math.Sin(DegToRad(0.625 * alfa1)), -diameterPitch / 2 * Math.Cos(DegToRad(0.625 * alfa1)), -(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(0.75 * alfa1)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(0.75 * alfa1)), 1); _doc.ksArcBy3Points(-(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(0.75 * alfa1)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(0.75 * alfa1)), -(diameterOut / 2 + 2) * Math.Sin(DegToRad(0.375 * alfa1)), -(diameterOut / 2 + 2) * Math.Cos(DegToRad(0.375 * alfa1)), -(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(0)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(0)), 1); _doc.ksDeleteMtr(); iSketch2Def.EndEdit(); } } // интерфейс второго эскиза выреза между зубьями ksEntity iSketch3Entity = iPart.NewEntity((short)Obj3dType.o3d_sketch) as ksEntity; if (iSketch3Entity != null) { ksSketchDefinition iSketch3Def = iSketch3Entity.GetDefinition() as ksSketchDefinition; if (iSketch3Def != null) { // строим на плоскости YOZ iSketch3Def.SetPlane(planeYoz); iSketch3Entity.Create(); _doc = iSketch3Def.BeginEdit() as ksDocument2D; alfa2 = -(180 / Math.PI * (thickness * Math.Tan(Math.PI * (angle) / 180) / diameterPitch)); _doc.ksMtr(0, 0, 90, 1, 1); // вычерчивание изображения эскиза // вместо эвольвент для простоты // берем обычные дуги по трем точкам _doc.ksArcBy3Points(-(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(alfa2)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(alfa2)), -diameterPitch / 2 * Math.Sin(DegToRad(alfa1 / 8 + alfa2)), -diameterPitch / 2 * Math.Cos(DegToRad(alfa1 / 8 + alfa2)), -diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 4 + alfa2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 4 + alfa2)), 1); _doc.ksArcByPoint(0, 0, diameterIn / 2, -diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 4 + alfa2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 4 + alfa2)), -diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 2 + alfa2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 2 + alfa2)), -1, 1); _doc.ksArcBy3Points(-diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 2 + alfa2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 2 + alfa2)), -diameterPitch / 2 * Math.Sin(DegToRad(0.625 * alfa1 + alfa2)), -diameterPitch / 2 * Math.Cos(DegToRad(0.625 * alfa1 + alfa2)), -(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(0.75 * alfa1 + alfa2)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(0.75 * alfa1 + alfa2)), 1); _doc.ksArcBy3Points(-(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(0.75 * alfa1 + alfa2)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(0.75 * alfa1 + alfa2)), -(diameterOut / 2 + 2) * Math.Sin(DegToRad(0.375 * alfa1 + alfa2)), -(diameterOut / 2 + 2) * Math.Cos(DegToRad(0.375 * alfa1 + alfa2)), -(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(alfa2)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(alfa2)), 1); _doc.ksDeleteMtr(); iSketch3Def.EndEdit(); } } // вторая смещенная плоскость ksEntity iOffsetPlane1Entity = iPart.NewEntity((short)Obj3dType.o3d_planeOffset) as ksEntity; if (iOffsetPlane1Entity != null) { ksPlaneOffsetDefinition iOffsetPlane1Def = iOffsetPlane1Entity.GetDefinition() as ksPlaneOffsetDefinition; if (iOffsetPlane1Def != null) { // величина смещения та же iOffsetPlane1Def.offset = thickness / 2; // направление противоположное iOffsetPlane1Def.direction = true; iOffsetPlane1Def.SetPlane(planeYoz); // делаем плоскость скрытой iOffsetPlane1Entity.hidden = true; // создаем смещенную плоскость iOffsetPlane1Entity.Create(); } } // третий (последний) эскиз выреза между зубьями ksEntity iSketch4Entity = iPart.NewEntity((short)Obj3dType.o3d_sketch) as ksEntity; if (iSketch4Entity != null) { ksSketchDefinition iSketch4Def = iSketch4Entity.GetDefinition() as ksSketchDefinition; if (iSketch4Def != null) { // базовая плоскость – только что созданная смещенная iSketch4Def.SetPlane(iOffsetPlane1Entity); iSketch4Entity.Create(); _doc = iSketch4Def.BeginEdit() as ksDocument2D; alfa2 = -(180 / Math.PI * (2 * thickness * Math.Tan(Math.PI * (angle) / 180) / diameterPitch)); _doc.ksMtr(0, 0, 90, 1, 1); // вычерчивание изображения эскиза // вместо эвольвент для простоты // берем обычные дуги по трем точкам _doc.ksArcBy3Points(-(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(alfa2)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(alfa2)), -diameterPitch / 2 * Math.Sin(DegToRad(alfa1 / 8 + alfa2)), -diameterPitch / 2 * Math.Cos(DegToRad(alfa1 / 8 + alfa2)), -diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 4 + alfa2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 4 + alfa2)), 1); _doc.ksArcByPoint(0, 0, diameterIn / 2, -diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 4 + alfa2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 4 + alfa2)), -diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 2 + alfa2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 2 + alfa2)), -1, 1); _doc.ksArcBy3Points(-diameterIn / 2 * Math.Sin(DegToRad(alfa1 / 2 + alfa2)), -diameterIn / 2 * Math.Cos(DegToRad(alfa1 / 2 + alfa2)), -diameterPitch / 2 * Math.Sin(DegToRad(0.625 * alfa1 + alfa2)), -diameterPitch / 2 * Math.Cos(DegToRad(0.625 * alfa1 + alfa2)), -(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(0.75 * alfa1 + alfa2)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(0.75 * alfa1 + alfa2)), 1); _doc.ksArcBy3Points(-(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(0.75 * alfa1 + alfa2)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(0.75 * alfa1 + alfa2)), -(diameterOut / 2 + 2) * Math.Sin(DegToRad(0.375 * alfa1 + alfa2)), -(diameterOut / 2 + 2) * Math.Cos(DegToRad(0.375 * alfa1 + alfa2)), -(diameterOut / 2 + 0.1) * Math.Sin(DegToRad(alfa2)), -(diameterOut / 2 + 0.1) * Math.Cos(DegToRad(alfa2)), 1); _doc.ksDeleteMtr(); iSketch4Def.EndEdit(); } } // интерфейс операции Вырезать по сечениям ksEntity iCutLoftEntity = iPart.NewEntity((short)Obj3dType.o3d_cutLoft) as ksEntity; if (iCutLoftEntity != null) { // интерфейс параметров операции по сечениям ksCutLoftDefinition iCutLoftDef = iCutLoftEntity.GetDefinition() as ksCutLoftDefinition; if (iCutLoftDef != null) { // интерфейс массива ksEntityCollection // коллекции эскизов для вырезания по сечениям ksEntityCollection collect = iCutLoftDef.Sketchs() as ksEntityCollection; // добавляем эскизы в колекцию collect.Add(iSketch2Entity); collect.Add(iSketch3Entity); collect.Add(iSketch4Entity); // создаем операцию по сечениям // результат – первый вырез между зубьями в венце колеса iCutLoftEntity.Create(); } } // интерфейс вспомогательной оси на пересечении двух плоскостей ksEntity iAxis = iPart.NewEntity((short)Obj3dType.o3d_axis2Planes) as ksEntity; if (iAxis != null) { // интерфейс параметров вспомогательной оси // на пересечении плоскостей ksAxis2PlanesDefinition iAxis2PlDef = iAxis.GetDefinition() as ksAxis2PlanesDefinition; if (iAxis2PlDef != null) { // задаем плоскости iAxis2PlDef.SetPlane(1, planeXoz); iAxis2PlDef.SetPlane(2, planeXoy); // делаем ось невидимой iAxis.hidden = true; // создаем вспомогательную ось iAxis.Create(); } } // интерфейс операции Массив по концентрической сетке ksEntity iCircularCopy = iPart.NewEntity((short)Obj3dType.o3d_circularCopy) as ksEntity; if (iCircularCopy != null) { // интерфейс параметров операции копирования по массиву ksCircularCopyDefinition iCirCopyDef = iCircularCopy.GetDefinition() as ksCircularCopyDefinition; if (iCirCopyDef != null) { // коллекция операций для копирования ksEntityCollection collect1 = iCirCopyDef.GetOperationArray() as ksEntityCollection; // операция всего лишь одна – вырезание зуба collect1.Add(iCutLoftEntity); // количество копий, равно количеству зубьев iCirCopyDef.count2 = teethCount; iCirCopyDef.factor2 = true; // ось копирования iCirCopyDef.SetAxis(iAxis); // создаем концентрический массив – колесо готово! iCircularCopy.Create(); } } } }
/// <summary> /// Метод рисует эскиз в виде части сектора /// </summary> /// <param name="internalArcOfDipRadius">Внутренний диаметр выреза</param> /// <param name="externalArcOfDipRadius">Внещний диаметр выреза</param> /// <param name="m">Модуль жесткости</param> /// <param name="z">Количество зубъев</param> /// <param name="k">Ширина ребер жескости</param> /// <param name="angle54">Угол 54 градусов</param> /// <returns></returns> public bool DrawDipSketch(double internalArcOfDipRadius, double externalArcOfDipRadius, double m, double z, double k, double angle54) { double a0 = _app.Mat.ksAngle(0, 0, 1, 0); double a180 = _app.Mat.ksAngle(0, 0, -1, 0); double x; double y; double l = k / 2; // диаметр большей дуги углубления // диаметр меньшей дуги углубления try { SketchCreator sketchCreator = new SketchCreator(_app); ksSketchDefinition def = sketchCreator.MakeSketch(); ksDocument2D doc = (ksDocument2D)def.BeginEdit(); short mathPoint = (short)StructType2DEnum.ko_MathPointParam; ksMathPointParam p1 = (ksMathPointParam)_app.Kompas.GetParamStruct(mathPoint); // задается проекция толщины ребра жесткости на ось Х p1.x = -l / Math.Sin(angle54); p1.y = 0; // координаты точки на ребре жесткости ksMathPointParam p2 = (ksMathPointParam)_app.Kompas.GetParamStruct(mathPoint); p2.x = (Math.Cos(angle54) * m * z) + p1.x; p2.y = Math.Sin(angle54) * m * z; Point point1 = new Point(p1.x, p1.y); Point point2 = new Point(p2.x, p2.y); // координаты точки пересечения большей дуги углубления // и прямой проходящей вдоль ребра жесткости ksMathPointParam pA = (ksMathPointParam)_app.Kompas.GetParamStruct(mathPoint); PointIntersect pointIntersect = new PointIntersect(_app); pointIntersect.LinArc(point1, point2, internalArcOfDipRadius, a0, a180, pA); // координаты точки пересечения меньшей дуги углубления // и прямой проходящей вдоль ребра жесткости ksMathPointParam pB = (ksMathPointParam)_app.Kompas.GetParamStruct(mathPoint); pointIntersect.LinArc(point1, point2, externalArcOfDipRadius, a0, a180, pB); double lineSegY = m * (z + 3); doc.ksPoint(pB.x, pB.y, 1); ksMathPointParam pC = (ksMathPointParam)_app.Kompas.GetParamStruct(mathPoint); _app.Mat.ksSymmetry(pA.x, pA.y, 0, 0, 0, lineSegY, out x, out y); pC.x = x; pC.y = y; ksMathPointParam pD = (ksMathPointParam)_app.Kompas.GetParamStruct(mathPoint); _app.Mat.ksSymmetry(pB.x, pB.y, 0, 0, 0, lineSegY, out x, out y); pD.x = x; pD.y = y; doc.ksArcByPoint(0, 0, internalArcOfDipRadius, pA.x, pA.y, pC.x, pC.y, 1, 1); doc.ksArcByPoint(0, 0, externalArcOfDipRadius, pB.x, pB.y, pD.x, pD.y, 1, 1); doc.ksLineSeg(pA.x, pA.y, pB.x, pB.y, 1); doc.ksLineSeg(pC.x, pC.y, pD.x, pD.y, 1); def.EndEdit(); return(true); } catch { return(false); } }
/// <summary> /// Метод рисует эскиз для выреза зубьев согласно расчетам в работе 1 по ссылке /// http://edu.ascon.ru/source/files/methods/method_osnovy_autoconstruct.pdf /// </summary> public bool DrawGearTeeth(double m, double baseCircle, double mainCircle, double projectionCircle, double troughsCircle) { try { SketchCreator sketchCreator = new SketchCreator(_app); ksSketchDefinition def = sketchCreator.MakeSketch(); ksDocument2D doc = (ksDocument2D)def.BeginEdit(); // углы double[] angle = new double[4] { 0, 90, 180, 270 }; _pointArraySize = 1; Array.Resize <Point>(ref _pointArray, _pointArraySize); _pointArray[0] = new Point(0, 0); // точка 1 double[] parameters = new double[] { 0, projectionCircle, baseCircle / 2, angle[0], angle[2] }; GetPointIntersect(_linArc, parameters); // точка 2 parameters = new double[] { _mathPointArray[0].x, _mathPointArray[0].y, baseCircle / 2, angle[0], angle[2], 0.5 * Math.PI * m, angle[1], angle[3] }; GetPointIntersect(_arcArc, parameters); // точка 3 parameters = new double[] { _mathPointArray[_mathPointArraySize - 1].x, _mathPointArray[_mathPointArraySize - 1].y, mainCircle / 2, angle[0], angle[2], baseCircle / 6, angle[3], angle[1] }; GetPointIntersect(_arcArc, parameters); // точка С parameters = new double[] { _mathPointArray[_mathPointArraySize - 1].x, _mathPointArray[_mathPointArraySize - 1].y, projectionCircle / 2, angle[0], angle[2], baseCircle / 6, angle[1], angle[3] }; GetPointIntersect(_arcArc, parameters); // точка 4 parameters = new double[] { _mathPointArray[_mathPointArraySize - 2].x, _mathPointArray[_mathPointArraySize - 2].y, mainCircle / 2, angle[0], angle[2], baseCircle / 6, angle[1], angle[3] }; GetPointIntersect(_arcArc, parameters); // точка F parameters = new double[] { _mathPointArray[_mathPointArraySize - 1].x, _mathPointArray[_mathPointArraySize - 1].y, troughsCircle / 2, angle[0], angle[2] }; GetPointIntersect(_linArc, parameters); // точка 5 parameters = new double[] { _mathPointArray[0].x, _mathPointArray[0].y, baseCircle / 2, angle[0], angle[2], 0.75 * Math.PI * m, angle[1], angle[3] }; GetPointIntersect(_arcArc, parameters); // точка А GetSymmetry(3); // точка D GetSymmetry(5); // точка 3' GetSymmetry(2); // точка 4' GetSymmetry(4); _mathPointArraySize++; Array.Resize <ksMathPointParam>(ref _mathPointArray, _mathPointArraySize); short mathPoint = (short)StructType2DEnum.ko_MathPointParam; _mathPointArray[_mathPointArraySize - 1] = (ksMathPointParam)_app.Kompas.GetParamStruct(mathPoint); _mathPointArray[_mathPointArraySize - 1].x = 0; _mathPointArray[_mathPointArraySize - 1].y = 0; doc.ksArcByPoint(_mathPointArray[2].x, _mathPointArray[2].y, baseCircle / 6, _mathPointArray[3].x, _mathPointArray[3].y, _mathPointArray[4].x, _mathPointArray[4].y, 1, 1); doc.ksArcByPoint(_mathPointArray[9].x, _mathPointArray[9].y, baseCircle / 6, _mathPointArray[10].x, _mathPointArray[10].y, _mathPointArray[7].x, _mathPointArray[7].y, 1, 1); doc.ksArcByPoint(_mathPointArray[11].x, _mathPointArray[11].y, troughsCircle / 2, _mathPointArray[5].x, _mathPointArray[5].y, _mathPointArray[8].x, _mathPointArray[8].y, 1, 1); doc.ksArcByPoint(_mathPointArray[11].x, _mathPointArray[11].y, projectionCircle / 2, _mathPointArray[3].x, _mathPointArray[3].y, _mathPointArray[7].x, _mathPointArray[7].y, 1, 1); doc.ksLineSeg(_mathPointArray[4].x, _mathPointArray[4].y, _mathPointArray[5].x, _mathPointArray[5].y, 1); doc.ksLineSeg(_mathPointArray[10].x, _mathPointArray[10].y, _mathPointArray[8].x, _mathPointArray[8].y, 1); def.EndEdit(); return(true); } catch { return(false); } }