summaryrefslogtreecommitdiffstats
path: root/Master/CGuCAD/projects/Markus/Abschluss.cs
diff options
context:
space:
mode:
authorSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
committerSven Eisenhauer <sven@sven-eisenhauer.net>2023-11-10 15:11:48 +0100
commit33613a85afc4b1481367fbe92a17ee59c240250b (patch)
tree670b842326116b376b505ec2263878912fca97e2 /Master/CGuCAD/projects/Markus/Abschluss.cs
downloadStudium-master.tar.gz
Studium-master.tar.bz2
add new repoHEADmaster
Diffstat (limited to 'Master/CGuCAD/projects/Markus/Abschluss.cs')
-rw-r--r--Master/CGuCAD/projects/Markus/Abschluss.cs369
1 files changed, 369 insertions, 0 deletions
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();
+ }
+ }
+
+ }
+}