/// <summary> /// Функция построения ножек /// </summary> /// <param name="tableSettings">Параметры столика</param> private void BuildLegs(TableSettings tableSettings) { var document = (ksDocument3D)_kompas.ActiveDocument3D(); var part = (ksPart)document.GetPart((short)Part_Type.pTop_Part); if (part != null) { var legsOffsetPlane = (ksEntity)part.NewEntity((short)Obj3dType.o3d_planeOffset); var legsOffsetPlaneDef = (ksPlaneOffsetDefinition)legsOffsetPlane.GetDefinition(); var basePlane = (ksEntity)part.GetDefaultEntity( (short)Obj3dType.o3d_planeXOY); legsOffsetPlaneDef.SetPlane(basePlane); legsOffsetPlaneDef.offset = tableSettings.TabletopThickness; legsOffsetPlane.Create(); _legsOffsetPlane = legsOffsetPlane; var legsSketch = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch); if (legsSketch != null) { legsSketch.name = "Эскиз ножек"; var legsSketchDefinition = (ksSketchDefinition)legsSketch.GetDefinition(); if (legsSketchDefinition != null) { legsSketchDefinition.SetPlane(legsOffsetPlane); legsSketch.Create(); var draw = (ksDocument2D)legsSketchDefinition.BeginEdit(); DrawLeg(draw, -_halfX, _halfY, tableSettings.LegLength); DrawLeg(draw, -_halfX, -_halfY + tableSettings.LegLength, tableSettings.LegLength); DrawLeg(draw, _halfX - tableSettings.LegLength, _halfY, tableSettings.LegLength); DrawLeg(draw, _halfX - tableSettings.LegLength, -_halfY + tableSettings.LegLength, tableSettings.LegLength); legsSketchDefinition.EndEdit(); var extr = (ksEntity)part.NewEntity( (short)Obj3dType.o3d_bossExtrusion); if (extr != null) { extr.name = "Выдавливание ножек"; var extrDef = (ksBossExtrusionDefinition)extr.GetDefinition(); if (extrDef != null) { extrDef.directionType = (short)Direction_Type.dtNormal; extrDef.SetSideParam(true, (short)End_Type.etBlind, tableSettings.LegHeight); extrDef.SetSketch(legsSketch); extr.Create(); } } } } } }
/// <summary> /// Построение разделителей /// </summary> /// <param name="tableSettings">Параметры столика</param> private void BuildSeptums(TableSettings tableSettings) { var document = (ksDocument3D)_kompas.ActiveDocument3D(); var part = (ksPart)document.GetPart((short)Part_Type.pTop_Part); if (part != null) { var septumOffsetPlane = (ksEntity)part.NewEntity( (short)Obj3dType.o3d_planeOffset); var septOffsetPlaneDef = (ksPlaneOffsetDefinition) septumOffsetPlane.GetDefinition(); septOffsetPlaneDef.SetPlane(_legsOffsetPlane); septOffsetPlaneDef.offset = tableSettings.SeptumOffset; septumOffsetPlane.Create(); var septumSketch = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch); if (septumSketch != null) { septumSketch.name = "Эскиз разделителей"; var septumSketchDef = (ksSketchDefinition)septumSketch.GetDefinition(); septumSketchDef.SetPlane(septumOffsetPlane); septumSketch.Create(); double a = 20; double b = (_halfX - tableSettings.LegLength) - (-_halfX + tableSettings.LegLength); var sketchEdit = septumSketchDef.BeginEdit(); DrawSeptum(sketchEdit, -_halfX + tableSettings.LegLength, _halfY - 10, a, b, 0); DrawSeptum(sketchEdit, _halfX - 10, _halfY - tableSettings.LegLength, b, a, 1); DrawSeptum(sketchEdit, -_halfX + tableSettings.LegLength, -_halfY + 10, a, b, 2); DrawSeptum(sketchEdit, -_halfX + 10, _halfY - tableSettings.LegLength, b, a, 0); septumSketchDef.EndEdit(); var extr = (ksEntity)part.NewEntity( (short)Obj3dType.o3d_bossExtrusion); if (extr != null) { extr.name = "Выдавливание разделителей"; var extrDef = (ksBossExtrusionDefinition)extr.GetDefinition(); if (extrDef != null) { extrDef.directionType = (short)Direction_Type.dtNormal; extrDef.SetSideParam(true, (short)End_Type.etBlind, tableSettings.SeptumLength); extrDef.SetSketch(septumSketch); extr.Create(); } } } } }
/// <summary> /// Строит столешницу центром (0, 0) на плоскости XOY /// </summary> /// <param name="tableSettings">Параметры столика</param> private void BuildTabletop(TableSettings tableSettings) { _halfX = (double)tableSettings.TabletopLength / 2.0d; _halfY = (double)tableSettings.TabletopLength / 2.0d; var document = (ksDocument3D)_kompas.ActiveDocument3D(); var part = (ksPart)document.GetPart((short)Part_Type.pTop_Part); var basePlane = (ksEntity)part.GetDefaultEntity( (short)Obj3dType.o3d_planeXOY); if (part != null) { var sketch = (ksEntity)part.NewEntity((short)Obj3dType.o3d_sketch); if (sketch != null) { sketch.name = "Эскиз столешницы"; var sketchDef = (ksSketchDefinition)sketch.GetDefinition(); if (sketchDef != null) { sketchDef.SetPlane(basePlane); sketch.Create(); var draw = (ksDocument2D)sketchDef.BeginEdit(); draw.ksLineSeg(-_halfX, -_halfY, _halfX, -_halfY, 1); draw.ksLineSeg(_halfX, -_halfY, _halfX, _halfY, 1); draw.ksLineSeg(_halfX, _halfY, -_halfX, _halfY, 1); draw.ksLineSeg(-_halfX, _halfY, -_halfX, -_halfY, 1); sketchDef.EndEdit(); var extr = (ksEntity)part.NewEntity( (short)Obj3dType.o3d_bossExtrusion); if (extr != null) { extr.name = "Выдавливание столешницы"; var extrDef = (ksBossExtrusionDefinition)extr.GetDefinition(); if (extrDef != null) { extrDef.directionType = (short)Direction_Type.dtNormal; extrDef.SetSideParam(true, (short)End_Type.etBlind, tableSettings.TabletopThickness); extrDef.SetSketch(sketch); extr.Create(); } } } } } }
/// <summary> /// Конструктор. Включает Компас и создает документ /// </summary> /// <param name="tableSettings">Параметры столика, из которого Компас построит его</param> public KompasBuilder(TableSettings tableSettings) { if (_kompas == null) { //try //{ // string progID = "Kompas.Application.5"; // _kompas = (KompasObject)Marshal.GetActiveObject(progID); //} //catch //{ // Type t = Type.GetTypeFromProgID("Kompas.Application.5"); // _kompas = (KompasObject)Activator.CreateInstance(t); //} Type t = Type.GetTypeFromProgID("Kompas.Application.5"); _kompas = (KompasObject)Activator.CreateInstance(t); } if (_kompas != null) { try { _kompas.Visible = true; _kompas.ActivateControllerAPI(); } catch { Type t = Type.GetTypeFromProgID("Kompas.Application.5"); _kompas = (KompasObject)Activator.CreateInstance(t); _kompas.Visible = true; _kompas.ActivateControllerAPI(); } } var document = (ksDocument3D)_kompas.Document3D(); document.Create(); BuildTabletop(tableSettings); BuildLegs(tableSettings); if (tableSettings.WithSeptums) { BuildSeptums(tableSettings); } if (tableSettings.RoundedEdgesTabletop) { RoundTabletop(tableSettings); } }
/// <summary> /// Обработчик нажатия на кнопку построения столика /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ButtonBuildTable_Click(object sender, EventArgs e) { if (!ValidateForEmptiness()) { return; } uint tabletopLength = Convert.ToUInt32(txtBoxTabletopLength.Text); uint tabletopThickness = Convert.ToUInt32(tableTopThicknessTextBox.Text); uint legHeight = Convert.ToUInt32(legHeightTextBox.Text); uint legLength = Convert.ToUInt32(legLengthTextBox.Text); uint septumLength = 0; uint septumOffset = 0; bool withSeptums = chkBoxBuildSeptums.Checked; if (withSeptums) { septumLength = Convert.ToUInt32(txtBoxSeptumLength.Text); septumOffset = Convert.ToUInt32(txtBoxSeptumOffset.Text); } else { septumLength = 0; septumOffset = 0; } bool roundedEdges = chkBoxRoundedEdgesTabletop.Checked; try { _tableSettings = new TableSettings(tabletopLength, tabletopThickness, legHeight, legLength, withSeptums, septumLength, septumOffset, roundedEdges); } catch (ArgumentException ex) { _errorList.Add(ex.Message); ShowErrors(); return; } if (BuildClick != null) { BuildClick(this, EventArgs.Empty); } }
/// <summary> /// Скругление краев столешницы /// </summary> /// <param name="tableSettings">Параметры столешницы</param> private void RoundTabletop(TableSettings tableSettings) { var document = (ksDocument3D)_kompas.ActiveDocument3D(); var part = (ksPart)document.GetPart((short)Part_Type.pTop_Part); var fillet = (ksEntity)part.NewEntity((short)Obj3dType.o3d_fillet); if (fillet != null) { fillet.name = "Скругление краёв столешницы"; var filletDef = (ksFilletDefinition)fillet.GetDefinition(); if (filletDef != null) { filletDef.radius = 5; filletDef.tangent = false; var edgeArrayY = (ksEntityCollection)part.EntityCollection( (short)Obj3dType.o3d_edge); var edgeArrayYminus = (ksEntityCollection)part.EntityCollection( (short)Obj3dType.o3d_edge); var edgeArrayX = (ksEntityCollection)part.EntityCollection( (short)Obj3dType.o3d_edge); var edgeArrayXminus = (ksEntityCollection)part.EntityCollection( (short)Obj3dType.o3d_edge); edgeArrayY.SelectByPoint(0, _halfY, 0); edgeArrayYminus.SelectByPoint(0, -_halfY, 0); edgeArrayX.SelectByPoint(_halfX, 0, 0); edgeArrayXminus.SelectByPoint(-_halfX, 0, 0); var filletArray = (ksEntityCollection)filletDef.array(); filletArray.Clear(); filletArray.Add(edgeArrayY.First()); filletArray.Add(edgeArrayYminus.First()); filletArray.Add(edgeArrayX.First()); filletArray.Add(edgeArrayXminus.First()); fillet.Create(); } } }