public void UninitializeCATIA() { cPart = null; cBodies = null; cCurrentBody = null; cShapes = null; cFactory = null; cShapeFactory = null; cHybridShapeFactory = null; cSketches = null; cOriginalElements = null; }
//// CATIA 관련 함수 public bool InitializeCATIA(string filePath, int mode) { try { cApp = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application"); } catch { cApp = (INFITF.Application)Activator.CreateInstance(Type.GetTypeFromProgID("CATIA.Application")); } if (cApp == null) { return(false); } cDocs = cApp.Documents; if (mode == 0) { cPartDoc = (MECMOD.PartDocument)cDocs.Read(filePath); } else if (mode == 1) { cPartDoc = (MECMOD.PartDocument)cDocs.Add("Part"); } cApp.Visible = true; cPart = cPartDoc.Part; cBodies = cPart.Bodies; cFactory = cPart.ShapeFactory; cShapeFactory = (PARTITF.ShapeFactory)cFactory; cHybridShapeFactory = (HybridShapeTypeLib.HybridShapeFactory)cPart.HybridShapeFactory; cCurrentBody = cBodies.Item(1); cShapes = cCurrentBody.Shapes; cSketches = cCurrentBody.Sketches; cOriginalElements = cPart.OriginElements; if (ReferenceManager == null) { ReferenceManager = new Reference(this); } return(true); }
private void button1_Click(object sender, EventArgs e) { INFITF.Application Catia; try { Catia = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application"); } catch { Catia = (INFITF.Application)Activator.CreateInstance(Type.GetTypeFromProgID("CATIA.Application")); Catia.Visible = true; } INFITF.Documents Docts = Catia.Documents; MECMOD.PartDocument PrtDoc = (MECMOD.PartDocument)Docts.Add("Part"); MECMOD.Part Prt = PrtDoc.Part; MECMOD.Bodies Bodis = Prt.Bodies; MECMOD.Body PartBody = Bodis.Item(1); MECMOD.Body Body = Bodis.Add(); MECMOD.Sketches Skts = Body.Sketches; INFITF.Reference plane = (INFITF.Reference)Prt.OriginElements.PlaneXY; MECMOD.Sketch Skt = Skts.Add(plane); MECMOD.Factory2D Fac2D = Skt.OpenEdition(); Point2D Pt1 = Fac2D.CreatePoint(50, 50); Point2D Pt2 = Fac2D.CreatePoint(50, 100); Point2D Pt3 = Fac2D.CreatePoint(100, 100); Point2D Pt4 = Fac2D.CreatePoint(100, 50); // << Create Line >> Line2D Lin1 = Fac2D.CreateLine(50, 50, 50, 100); Line2D Lin2 = Fac2D.CreateLine(50, 100, 100, 100); Line2D Lin3 = Fac2D.CreateLine(100, 100, 100, 50); Line2D Lin4 = Fac2D.CreateLine(100, 50, 50, 50); // Line2D Lin22 = MCreateLine(Fac2d, Pt1, Pt2); //라인의 시작점부터 마지막점을 결정 Lin1.StartPoint = Pt1; Lin1.EndPoint = Pt2; Lin2.StartPoint = Pt2; Lin2.EndPoint = Pt3; Lin3.StartPoint = Pt3; Lin3.EndPoint = Pt4; Lin4.StartPoint = Pt4; Lin4.EndPoint = Pt1; INFITF.Reference rline1 = Prt.CreateReferenceFromGeometry(Lin1); INFITF.Reference rline2 = Prt.CreateReferenceFromGeometry(Lin2); INFITF.Reference rline3 = Prt.CreateReferenceFromGeometry(Lin3); INFITF.Reference rline4 = Prt.CreateReferenceFromGeometry(Lin4); INFITF.Reference rlineH = Prt.CreateReferenceFromGeometry(Skt.AbsoluteAxis.HorizontalReference); INFITF.Reference rlineV = Prt.CreateReferenceFromGeometry(Skt.AbsoluteAxis.VerticalReference); MECMOD.Constraint d1 = Skt.Constraints.AddBiEltCst(CatConstraintType.catCstTypeDistance, rline1, rline3); MECMOD.Constraint d2 = Skt.Constraints.AddBiEltCst(CatConstraintType.catCstTypeDistance, rline2, rline4); MECMOD.Constraint d3 = Skt.Constraints.AddBiEltCst(CatConstraintType.catCstTypeDistance, rlineH, rline4); MECMOD.Constraint d4 = Skt.Constraints.AddBiEltCst(CatConstraintType.catCstTypeDistance, rlineV, rline1); Skt.CloseEdition();//Skech조건 끝 // //PAD를 하기 위해서 조건문을 만든다.// PARTITF.ShapeFactory ShpFac = (PARTITF.ShapeFactory)Prt.ShapeFactory; //그 shapeFactory를 돌출하기 위해서 AddNewPad를 사용해서 50만큼 돌출한다.// ShpFac.AddNewPad(Skt, 50); //새로운 Body2를 만들기 // MECMOD.Body Body2 = Bodis.Add(); //planed을 기준으로 Skt2를 만든다.// MECMOD.Sketch Skt2 = (MECMOD.Sketch)Body2.Sketches.Add(plane); //스켓이 시작 // Fac2D = Skt2.OpenEdition(); // X=75,Y=75 를 중심으로 D=20의 원을 만들기// Circle2D Cir2D = Fac2D.CreateClosedCircle(75, 75, 20); //스켓을 끝내기// Skt2.CloseEdition(); //PAD 80만큼 // ShpFac.AddNewPad(Skt2, 80); //Body3 만들기 // Body Body3 = Prt.Bodies.Add(); //Skt3를 Body2 안에 plane면을 기준으로 Sketche를 한다. Sketch Skt3 = Body2.Sketches.Add(plane); //스킷을 시작// Fac2D = Skt3.OpenEdition(); // X=75,Y=75 를 중심으로 D=5의 원을 만들기// Fac2D.CreateClosedCircle(75, 75, 5); //스켓3을 끝내기// Skt3.CloseEdition(); //스켓3을 80만큼 PAD를 한다. ShpFac.AddNewPad(Skt3, 80); ///////////////// //PartBody에 Prat In Work Object를 사용해서 조건을 만든다. Prt.InWorkObject = PartBody; ShpFac.AddNewAdd(Body); //PartBody에 Body를추가 ShpFac.AddNewAdd(Body2); //PartBody에 Body2를추가 ShpFac.AddNewRemove(Body3); //PartBody에 Body3를 제거한다 Prt.Update(); }
static void action(PlanarfaceWithReference cpl) { //all try try { pointsListDouble.Clear(); linesListDouble.Clear(); oPartDocument.Selection.Clear(); oPartDocument.Selection.Add(cpl.OPlanarFace); MECMOD.Body oBody = (MECMOD.Body)oPartDocument.Selection.FindObject("CATIAShape").Parent; MECMOD.Part oPart = (MECMOD.Part)oBody.Parent; MECMOD.Sketch oSketch = oBody.Sketches.Add(cpl.OReference); MECMOD.Factory2D oFactory2D = oSketch.OpenEdition(); oFactory2D.CreateProjection(cpl.OReference); oSketch.CloseEdition(); oPart.Update(); oPartDocument.Selection.Clear(); List <object[]> pointsListObjects = new List <object[]>(); List <MECMOD.Point2D> mecmodPointsForRemoveList = new List <MECMOD.Point2D>(); List <object[]> linesListObjects = new List <object[]>(); List <INFITF.AnyObject> mecmodlineForRemoveList = new List <INFITF.AnyObject>(); string sketchOriginName = oSketch.get_Name(); oSketch.set_Name(oSketch.get_Name() + "_Isolate_me_please."); oPart.Update(); oPartDocument.Selection.Add(oSketch); if (isolateKeyAuto) { SupportClass.isolateKeyAuto(); } bool isolate = false; int timeout = 60; const int sleep = 1000; while (!isolate) { catiaInstance.set_StatusBar("Isolate the sketch " + oSketch.get_Name() + " " + (timeout * 1000) / sleep + "s timeout"); Thread.Sleep(sleep); if (timeout <= 0) { catiaInstance.set_StatusBar("Macro timeout"); oPartDocument.Selection.Clear(); oPartDocument.Selection.Add(oSketch); oPartDocument.Selection.Delete(); return; } timeout--; try { foreach (MECMOD.GeometricElement geo in oSketch.GeometricElements) { if (geo.GeometricType == MECMOD.CatGeometricType.catGeoTypePoint2D) { MECMOD.Point2D oPoint = (MECMOD.Point2D)geo; isolate = true; object[] oPointArray = new object[2]; oPoint.GetCoordinates(oPointArray); pointsListObjects.Add(oPointArray); mecmodPointsForRemoveList.Add(oPoint); } if (geo.GeometricType == MECMOD.CatGeometricType.catGeoTypeLine2D) { MECMOD.Line2D oLine = (MECMOD.Line2D)geo; isolate = true; object[] oPointArray = new object[4]; oLine.GetEndPoints(oPointArray); linesListObjects.Add(oPointArray); mecmodlineForRemoveList.Add(oLine); } //NOT fully solved! Just gets endpoints and connets them by a line. if (geo.GeometricType == MECMOD.CatGeometricType.catGeoTypeCircle2D) { MECMOD.Circle2D oCircle = (MECMOD.Circle2D)geo; isolate = true; object[] oPointArray = new object[4]; oCircle.GetEndPoints(oPointArray); linesListObjects.Add(oPointArray); mecmodlineForRemoveList.Add(oCircle); } //NOT fully solved! Just gets endpoints and connets them by a line. if (geo.GeometricType == MECMOD.CatGeometricType.catGeoTypeEllipse2D) { MECMOD.Ellipse2D oElipse = (MECMOD.Ellipse2D)geo; isolate = true; object[] oPointArray = new object[4]; oElipse.GetEndPoints(oPointArray); linesListObjects.Add(oPointArray); mecmodlineForRemoveList.Add(oElipse); } //NOT fully solved! Just gets endpoints and connets them by a line. if (geo.GeometricType == MECMOD.CatGeometricType.catGeoTypeHyperbola2D) { MECMOD.Hyperbola2D oHyp = (MECMOD.Hyperbola2D)geo; isolate = true; object[] oPointArray = new object[4]; oHyp.GetEndPoints(oPointArray); linesListObjects.Add(oPointArray); mecmodlineForRemoveList.Add(oHyp); } //NOT fully solved! Just gets endpoints and connets them by a line. if (geo.GeometricType == MECMOD.CatGeometricType.catGeoTypeParabola2D) { MECMOD.Parabola2D oParab = (MECMOD.Parabola2D)geo; isolate = true; object[] oPointArray = new object[4]; oParab.GetEndPoints(oPointArray); linesListObjects.Add(oPointArray); mecmodlineForRemoveList.Add(oParab); } //NOT fully solved! Just gets endpoints and connets them by a line. if (geo.GeometricType == MECMOD.CatGeometricType.catGeoTypeSpline2D) { MECMOD.Spline2D oSpline = (MECMOD.Spline2D)geo; isolate = true; object[] oPointArray = new object[4]; oSpline.GetEndPoints(oPointArray); linesListObjects.Add(oPointArray); mecmodlineForRemoveList.Add(oSpline); } //????????????????????????????? if (geo.GeometricType == MECMOD.CatGeometricType.catGeoTypeUnknown) { MECMOD.Curve2D o = (MECMOD.Curve2D)geo; isolate = true; object[] oPointArray = new object[4]; o.GetEndPoints(oPointArray); linesListObjects.Add(oPointArray); mecmodlineForRemoveList.Add(o); } } } catch { } } oSketch.set_Name(sketchOriginName); oPart.Update(); oFactory2D = oSketch.OpenEdition(); oPartDocument.Selection.Clear(); foreach (MECMOD.Point2D p in mecmodPointsForRemoveList) { oPartDocument.Selection.Add(p); } foreach (INFITF.AnyObject l in mecmodlineForRemoveList) { oPartDocument.Selection.Add(l); } oPartDocument.Selection.Delete(); oSketch.CloseEdition(); oPart.Update(); foreach (object[] point in pointsListObjects) { pointsListDouble.Add(new double[] { Double.Parse(point[0].ToString()), Double.Parse(point[1].ToString()) }); } foreach (object[] line in linesListObjects) { linesListDouble.Add(new double[] { Double.Parse(line[0].ToString()), Double.Parse(line[1].ToString()), Double.Parse(line[2].ToString()), Double.Parse(line[3].ToString()) }); } double minX = pointsListDouble.Min(setting => setting[0]); double maxX = pointsListDouble.Max(setting => setting[0]); double minY = pointsListDouble.Min(setting => setting[1]); double maxY = pointsListDouble.Max(setting => setting[1]); const double delitel = 20; double rastrX = (Math.Abs(maxX - minX)) / delitel; if (rastrX < 0.1) { rastrX = 0.1; } double rastrY = (Math.Abs(maxY - minY)) / delitel; if (rastrY < 0.1) { rastrY = 0.1; } List <myRectangle> allRectanglesInThisLimit = new List <myRectangle>(); double rastrXvalue = minX; double rastrYvalue = minY; while (rastrYvalue < maxY) { while (rastrXvalue < maxX) { myRectangle rastrInsideLim = new myRectangle(rastrXvalue, rastrYvalue, rastrXvalue + rastrX, rastrYvalue + rastrY); allRectanglesInThisLimit.Add(rastrInsideLim); rastrXvalue += rastrX; } rastrXvalue = minX; rastrYvalue += rastrY; } List <myRectangle> allRectanglesInThisLimitNoZero = new List <myRectangle>(); foreach (myRectangle obl in allRectanglesInThisLimit) { if (obl.obsah != 0) { obl.resizeAllEdges(-Math.Min(rastrX, rastrY) * 0.1); allRectanglesInThisLimitNoZero.Add(obl); } } List <myRectangle> allRectanglesInThisLimitNoCross = new List <myRectangle>(); foreach (myRectangle obl2 in allRectanglesInThisLimitNoZero) { if (!obl2.anyLineFromListCrossRectangle(linesListDouble)) { allRectanglesInThisLimitNoCross.Add(obl2); } } if (debugRastr) { DebugCreateAll.createAll(allRectanglesInThisLimitNoCross, oSketch, catiaInstance); } double inflateX = rastrX / 10; double inflateY = rastrY / 10; double maxInflateAreaEdge = Math.Max(Math.Abs(maxX - minX) + rastrX, Math.Abs(maxY - minY) + rastrY); double maxInflateArea = maxInflateAreaEdge * maxInflateAreaEdge; List <myRectangle> maxRectanglesListIflatedNoLeak = new List <myRectangle>(); int count = 1; foreach (myRectangle obl in allRectanglesInThisLimitNoCross) { obl.resizeAllEdges(-Math.Min(rastrX, rastrY) * 0.1); bool leaked = false; if (count == 1) { double initilaArea = obl.obsah; leaked = SupportClass.inflationLoop(SupportClass.inflateDirection.B, obl, linesListDouble, inflateY, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.R, obl, linesListDouble, inflateX, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.T, obl, linesListDouble, inflateY, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.L, obl, linesListDouble, inflateX, initilaArea, maxInflateArea); } if (count == 2) { double initilaArea = obl.obsah; leaked = SupportClass.inflationLoop(SupportClass.inflateDirection.T, obl, linesListDouble, inflateY, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.L, obl, linesListDouble, inflateX, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.B, obl, linesListDouble, inflateY, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.R, obl, linesListDouble, inflateX, initilaArea, maxInflateArea); } if (count == 3) { double initilaArea = obl.obsah; leaked = SupportClass.inflationLoop(SupportClass.inflateDirection.R, obl, linesListDouble, inflateX, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.T, obl, linesListDouble, inflateY, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.L, obl, linesListDouble, inflateX, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.B, obl, linesListDouble, inflateY, initilaArea, maxInflateArea); } if (count == 4) { double initilaArea = obl.obsah; leaked = SupportClass.inflationLoop(SupportClass.inflateDirection.L, obl, linesListDouble, inflateX, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.B, obl, linesListDouble, inflateY, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.R, obl, linesListDouble, inflateX, initilaArea, maxInflateArea) || SupportClass.inflationLoop(SupportClass.inflateDirection.T, obl, linesListDouble, inflateY, initilaArea, maxInflateArea); } if (!leaked) { if (type == grooveType.Cross && Math.Min(obl.A, obl.B) > width * 2) { maxRectanglesListIflatedNoLeak.Add(obl); } if (type == grooveType.ZigZag && Math.Min(obl.A, obl.B) > width * 3) { maxRectanglesListIflatedNoLeak.Add(obl); } } count++; if (count > 4) { count = 1; } } if (debugInflated) { DebugCreateAll.createAll(maxRectanglesListIflatedNoLeak, oSketch, catiaInstance); } List <myRectangle> maxRectangleListIflatedNoLeakEdgesResized = new List <myRectangle>(); foreach (myRectangle obl in maxRectanglesListIflatedNoLeak) { obl.resizeAllEdges(-edges); if (obl.obsah > 0) { maxRectangleListIflatedNoLeakEdgesResized.Add(obl); } } double finalP1x = 0; double finalP1y = 0; double finalP2x = 0; double finalP2y = 0; myRectangle win = null; if (maxRectangleListIflatedNoLeakEdgesResized.Count > 0) { win = SupportClass.optimalMaxAndABRatio(maxRectangleListIflatedNoLeakEdgesResized); finalP1x = Math.Round(win.P1x, 1); finalP1y = Math.Round(win.P1y, 1); finalP2x = Math.Round(win.P2x, 1); finalP2y = Math.Round(win.P2y, 1); myRectangle finalRectangle = new myRectangle(finalP1x, finalP1y, finalP2x, finalP2y); crossLube finalcrossLube = new crossLube(finalRectangle, width, depth); ZigZagLube finalZigZagLube = new ZigZagLube(finalRectangle, width, depth); oPart.Update(); oFactory2D = oSketch.OpenEdition(); if (type == grooveType.ZigZag) { finalZigZagLube.toSketch(oFactory2D); } else { finalcrossLube.toSketch(oFactory2D); } oSketch.CloseEdition(); oPart.Update(); if (debugInflated || debugRastr) { return; } oPart.InWorkObject = oSketch; PARTITF.ShapeFactory oShapeFactory = (PARTITF.ShapeFactory)oPart.ShapeFactory; PARTITF.Pocket oNewPadPlus = oShapeFactory.AddNewPocket(oSketch, finalcrossLube.Depth); oPart.Update(); } else { MainForm.myForm.Activate(); MessageBox.Show(@"Groove for the face will not be created! Area si too small."); } //all catch }catch {} }