using System; using System.Collections.Generic; using System.Text; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using System.Collections; namespace Praktikum { public struct structLinien { public int iAnfangsPunkt; public int iEndPunkt; public double dLaenge; } class Abschluss { public struct structEckPoint { public int iPolyPos; public Point2d p2Eckpunkt; } public struct structFlaeche { public Point3d PunktA; public Point3d PunktB; public Point3d PunktC; } public void Main() { /* Line2d Linie = new Line2d(new Point2d(0,0),new Point2d(0,10)); Vector3d AnfangsPunkt = new Vector3d(0, 0, 1); Vector3d EndPunkt = new Vector3d(10, 0, 1); Vector3d Normale = AnfangsPunkt.CrossProduct(EndPunkt); Vector3d Punkt = new Vector3d(5, 5, 1); double Value = Normale.DotProduct(Punkt); */ CreateTriangle(getTriangPolyLine()); } private bool CreateTriangle(ObjectId objPolyObject) { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage("Traingeln!!!!!"); Database db = Application.DocumentManager.MdiActiveDocument.Database; Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = db.TransactionManager; Transaction transaction = tm.StartTransaction(); BlockTable blockTable = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false); BlockTableRecord blockTableRecord = (BlockTableRecord)tm.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite, false); Polyline polPoliline; try { polPoliline = (Polyline)tm.GetObject(objPolyObject, OpenMode.ForWrite, false); } catch { ed.WriteMessage("\nDas ist keine Polyline;)!!!!!"); return false; } int iEcken = polPoliline.NumberOfVertices - 1; if (polPoliline.GetPoint2dAt(0) != polPoliline.GetPoint2dAt(iEcken)) { ed.WriteMessage("\nLinie nicht geschlossen ;(!!!!!"); return false; } PolyNode[] pnEckpunkte = new PolyNode[iEcken]; for (int i = 0; i < (iEcken); i++) { pnEckpunkte[i] = new PolyNode(); pnEckpunkte[i].iNodeIndex = i; pnEckpunkte[i].p2DPoint = polPoliline.GetPoint2dAt(i); } AbschlusArbeiterklasse ABArbeiter = new AbschlusArbeiterklasse(); ArrayList alLinien = ABArbeiter.GetLinien(pnEckpunkte); createLayer("Triang"); LinienZeichnen(ref blockTableRecord, ref tm, alLinien, pnEckpunkte); // Flaechenzeichnen(ref blockTableRecord, ref tm, "Triang", alLinien, pnEckpunkte); transaction.Commit(); return true; } private void LinienZeichnen(ref BlockTableRecord blockTableRecord, ref Autodesk.AutoCAD.DatabaseServices.TransactionManager tm, ArrayList alLinien, PolyNode[] pnEckpunkte) { for (int i = 0; i < alLinien.Count; i++) { Point2d PunktEins = pnEckpunkte[(((structLinien)alLinien[i]).iAnfangsPunkt)].p2DPoint; Point2d PunktZwei = pnEckpunkte[(((structLinien)alLinien[i]).iEndPunkt)].p2DPoint; Face FlaecheA = new Face(new Point3d(PunktEins.X, PunktEins.Y, 0), new Point3d(PunktZwei.X, PunktZwei.Y, 0), new Point3d(PunktEins.X, PunktEins.Y, 0), true, true, true, true); blockTableRecord.AppendEntity(FlaecheA); tm.AddNewlyCreatedDBObject(FlaecheA, true); } } private void Flaechenzeichnen(ref BlockTableRecord blockTableRecord, ref Autodesk.AutoCAD.DatabaseServices.TransactionManager tm, string sLayer, ArrayList alLinien, PolyNode[] pnEckpunkte) { int iFarbe = 99; ArrayList alEckpunkte = new ArrayList(); for (int i = 0; i < pnEckpunkte.Length; i++) alEckpunkte.Add(pnEckpunkte[i]); structFlaeche[] strFaceSeiten = new structFlaeche[alLinien.Count + 1]; int count = 0; for (int i = 0; i < alEckpunkte.Count; i++) { if (alLinien.Count == 0) break; bool bEckpunkt = true; for (int j = 0; j < alLinien.Count; j++) { int iAnfangsPunkt = ((structLinien)alLinien[j]).iAnfangsPunkt; int iEndPunkt = ((structLinien)alLinien[j]).iEndPunkt; if ((((PolyNode)pnEckpunkte[i]).iNodeIndex == iAnfangsPunkt) || (((PolyNode)pnEckpunkte[i]).iNodeIndex == iEndPunkt)) { bEckpunkt = false; break; } } if (bEckpunkt) { strFaceSeiten[count].PunktA = getPoint(alEckpunkte, i); int iPosVorne = 0; int iPosHinten = alEckpunkte.Count - 1; if ((i + 1) != alEckpunkte.Count - 1) iPosVorne = i + 1; if ((i - 1) >= 0) iPosHinten = i - 1; strFaceSeiten[count].PunktB = getPoint(alEckpunkte, iPosVorne); strFaceSeiten[count].PunktC = getPoint(alEckpunkte, iPosHinten); count++; for (int j = 0; j < alLinien.Count; j++) { int iAnfangsPunkt = ((structLinien)alLinien[j]).iAnfangsPunkt; int iEndPunkt = ((structLinien)alLinien[j]).iEndPunkt; if ((Pruefen(alEckpunkte, iPosHinten, iAnfangsPunkt)) || (Pruefen(alEckpunkte, iPosHinten, iEndPunkt))) if ((Pruefen(alEckpunkte, iPosVorne, iAnfangsPunkt)) || (Pruefen(alEckpunkte, iPosVorne, iEndPunkt))) { alLinien.RemoveAt(j); j = 0; break; } } alEckpunkte.RemoveAt(i); i = -1; } } strFaceSeiten[strFaceSeiten.Length - 1] = getRestFace(alEckpunkte); for (int i = 0; i < strFaceSeiten.Length; i++) Seite(strFaceSeiten[i], ref blockTableRecord, ref tm, "Triang", iFarbe); } private structFlaeche getRestFace(ArrayList alEckpunkte) { structFlaeche strFlaeche = new structFlaeche(); strFlaeche.PunktA = new Point3d(((PolyNode)alEckpunkte[0]).p2DPoint.X, ((PolyNode)alEckpunkte[0]).p2DPoint.Y, 0); strFlaeche.PunktB = new Point3d(((PolyNode)alEckpunkte[1]).p2DPoint.X, ((PolyNode)alEckpunkte[1]).p2DPoint.Y, 0); strFlaeche.PunktC = new Point3d(((PolyNode)alEckpunkte[2]).p2DPoint.X, ((PolyNode)alEckpunkte[2]).p2DPoint.Y, 0); return strFlaeche; } private bool Pruefen(ArrayList alEckpunkte, int Index, int iPruefwert) { if (((PolyNode)alEckpunkte[Index]).iNodeIndex == iPruefwert) return true; else return false; } private Point3d getPoint(ArrayList alEckpunkte, int iIndex) { Point3d Temp = new Point3d(((PolyNode)alEckpunkte[iIndex]).p2DPoint.X, ((PolyNode)alEckpunkte[iIndex]).p2DPoint.Y, 0); return Temp; } private void Seite(structFlaeche Flaeche, ref BlockTableRecord blockTableRecord, ref Autodesk.AutoCAD.DatabaseServices.TransactionManager tm, string sLayer, int color) { Face FlaecheA = new Face(Flaeche.PunktA, Flaeche.PunktB, Flaeche.PunktC, true, true, true, true); FlaecheA.Layer = sLayer; FlaecheA.ColorIndex = color; blockTableRecord.AppendEntity(FlaecheA); tm.AddNewlyCreatedDBObject(FlaecheA, true); } private ArrayList getLinien(ArrayList alLinien, Polyline polPoliline) { ArrayList alGoodLines = new ArrayList(); int iFoundLines = 0; for (int i = alLinien.Count - 1; 0 < i; i--) { bool bSchneidet = false; for (int j = 0; j < alGoodLines.Count; j++) { Point2d Punkt1Linie1 = polPoliline.GetPoint2dAt(((structLinien)alGoodLines[j]).iAnfangsPunkt); Point2d Punkt2Linie1 = polPoliline.GetPoint2dAt(((structLinien)alGoodLines[j]).iEndPunkt); Point2d Punkt1Linie2 = polPoliline.GetPoint2dAt(((structLinien)alLinien[i]).iAnfangsPunkt); Point2d Punkt2Linie2 = polPoliline.GetPoint2dAt(((structLinien)alLinien[i]).iEndPunkt); bSchneidet = Schnittpunkt(Punkt1Linie1, Punkt2Linie1, Punkt1Linie2, Punkt2Linie2); if (bSchneidet == true) break; } if (!(bSchneidet)) { alGoodLines.Add((structLinien)alLinien[i]); iFoundLines++; } if ((polPoliline.NumberOfVertices - 4) == iFoundLines) break; } return alGoodLines; } private bool Schnittpunkt(Point2d Punkt1Linien1, Point2d Punkt2Linien1, Point2d Punkt1Linien2, Point2d Punkt2Linien2) { Vector3d VecLinieEinsAnfang = new Vector3d(Punkt1Linien1.X, Punkt1Linien1.Y, 1); Vector3d VecLinieEinsEnde = new Vector3d(Punkt2Linien1.X, Punkt2Linien1.Y, 1); Vector3d VecLinieZweiAnfang = new Vector3d(Punkt1Linien2.X, Punkt1Linien2.Y, 1); Vector3d VecLinieZweiEnde = new Vector3d(Punkt2Linien2.X, Punkt2Linien2.Y, 1); Vector3d NormaleEins = VecLinieEinsAnfang.CrossProduct(VecLinieEinsEnde); Vector3d NormaleZwei = VecLinieZweiAnfang.CrossProduct(VecLinieZweiEnde); Vector3d Schnittpunkt = NormaleEins.CrossProduct(NormaleZwei); Schnittpunkt = new Vector3d(Schnittpunkt.X / Schnittpunkt.Z, Schnittpunkt.Y / Schnittpunkt.Z, Schnittpunkt.Z / Schnittpunkt.Z); Point2d P2DSchnittpunkt = new Point2d(Schnittpunkt.X, Schnittpunkt.Y); if (VecLinieEinsAnfang != VecLinieZweiAnfang) if (VecLinieEinsEnde != VecLinieZweiAnfang) if (VecLinieEinsAnfang != VecLinieZweiEnde) if (VecLinieEinsEnde != VecLinieZweiEnde) { bool bErgebnis = IstDrauf(Punkt1Linien1, Punkt2Linien1, P2DSchnittpunkt); if (bErgebnis) return true; bErgebnis = IstDrauf(Punkt1Linien1, Punkt2Linien1, P2DSchnittpunkt); if (bErgebnis) return true; } return false; } public bool IstDrauf(Point2d Anfang, Point2d Ende, Point2d Endpunkt) { double LinieDist = Distance(Anfang, Ende); double ErsteDist = Distance(Anfang, Endpunkt); double ZweiteDist = Distance(Ende, Endpunkt); if ((ErsteDist + ZweiteDist) == LinieDist) return true; else return false; } private ArrayList SortLines(ArrayList alLinien) { for (int i = (alLinien.Count - 1); i >= 0; i--) for (int j = 1; j <= i; j++) if (((structLinien)alLinien[j - 1]).dLaenge < ((structLinien)alLinien[j]).dLaenge) { structLinien temp = (structLinien)alLinien[j - 1]; alLinien[j - 1] = alLinien[j]; alLinien[j] = temp; } return alLinien; } private ObjectId getTriangPolyLine() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; Editor editor = Application.DocumentManager.MdiActiveDocument.Editor; PromptEntityOptions options = new PromptEntityOptions("\nWähle die Polyline"); PromptEntityResult result = editor.GetEntity(options); return result.ObjectId; } private double Distance(Point2d p2dPunktEins, Point2d p2dPunktZwei) { double xDist = (p2dPunktEins.X - p2dPunktZwei.X); double yDist = (p2dPunktEins.Y - p2dPunktZwei.Y); return (Math.Sqrt(xDist * xDist + yDist * yDist)); } public void createLayer(string sLayer) { Database db = Application.DocumentManager.MdiActiveDocument.Database; Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = db.TransactionManager; Transaction transaction = tm.StartTransaction(); Editor editor = Application.DocumentManager.MdiActiveDocument.Editor; try {// gettheLayerTable LayerTable layerTable = (LayerTable)tm.GetObject(db.LayerTableId, OpenMode.ForRead, false); // check iflayerisalreadythere if (!layerTable.Has(sLayer)) { LayerTableRecord layerTableRecord = new LayerTableRecord(); layerTableRecord.Name = sLayer; layerTableRecord.IsFrozen = false; // layersetto layerTableRecord.IsOff = false; // layersetto ON layerTableRecord.IsLocked = false; // layerun-locked layerTableRecord.Color = Autodesk.AutoCAD.Colors.Color.FromColorIndex(Autodesk.AutoCAD.Colors.ColorMethod.ByAci, 50); // setlayercolorto red // Now, addthenewlayerto itscontainer layerTable.UpgradeOpen(); layerTable.Add(layerTableRecord); tm.AddNewlyCreatedDBObject(layerTableRecord, true); } else { editor.WriteMessage("\n" + sLayer + " Layer gibt es schon"); } transaction.Commit(); } catch (Autodesk.AutoCAD.Runtime.Exception) { transaction.Dispose(); } } } }