From 33613a85afc4b1481367fbe92a17ee59c240250b Mon Sep 17 00:00:00 2001 From: Sven Eisenhauer Date: Fri, 10 Nov 2023 15:11:48 +0100 Subject: add new repo --- Master/CGuCAD/projects/Markus/Abschluss.cs | 369 +++++++++++++++++++++++++++++ 1 file changed, 369 insertions(+) create mode 100644 Master/CGuCAD/projects/Markus/Abschluss.cs (limited to 'Master/CGuCAD/projects/Markus/Abschluss.cs') diff --git a/Master/CGuCAD/projects/Markus/Abschluss.cs b/Master/CGuCAD/projects/Markus/Abschluss.cs new file mode 100644 index 0000000..73dd3dc --- /dev/null +++ b/Master/CGuCAD/projects/Markus/Abschluss.cs @@ -0,0 +1,369 @@ +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(); + } + } + + } +} -- cgit v1.2.3