private bool extrudeOrg() { if (selectedObjectsList == null) { return(false); } IGeoObject iGeoObjectSel; blk = Block.Construct(); // zur Darstellung if (base.ActiveObject != null) { blk.CopyAttributes(base.ActiveObject); } // der block wird das neue aktive Objekt, er muss die Attribute tragen, weil sie später // wieder von ihm verlangt werden Boolean success = false; // hat er wenigstens eins gefunden int extrudeModeTemp = extrudeMode; // Merker, da extrudeMode evtl. umgeschaltet wird for (int i = 0; i < selectedObjectsList.Count; i++) // läuft über alle selektierten Objekte. Evtl nur eins bei Konstruktion { extrudeMode = extrudeModeTemp; iGeoObjectSel = selectedObjectsList[i]; // zur Vereinfachung geoObjectOrgList[i] = iGeoObjectSel; // zum Weglöschen des Originals in onDone ownerList[i] = iGeoObjectSel.Owner; // owner merken für löschen pathCreatedFromModelList[i] = null; shapeList[i] = null; Path p = null; if (iGeoObjectSel is ICurve) { p = CADability.GeoObject.Path.CreateFromModel(iGeoObjectSel as ICurve, Frame.ActiveView.Model, Frame.ActiveView.Projection, true); if (p == null) { // also nur Einzelelement if (iGeoObjectSel is Path) { // schon fertig p = iGeoObjectSel.Clone() as Path; } else { // Pfad aus Einzelobjekt machen: p = Path.Construct(); p.Set(new ICurve[] { iGeoObjectSel.Clone() as ICurve }); } } else { // CreateFromModel hat was zusammengesetzt geoObjectOrgList[i] = null; // zum nicht Weglöschen des Originals in onDone pathCreatedFromModelList[i] = p; // kopie merken für onDone p = p.Clone() as Path; p.Flatten(); } } if (p != null) { // Objekt hat keine Ebene und Objektebene eingestellt: Höheneingabe sperren // heightInput.ReadOnly = ((p.GetPlanarState() != PlanarState.Planar) && planeMode); if (planeMode) { if (p.GetPlanarState() != PlanarState.Planar) { heightInput.ReadOnly = true; // heightOffsetInput.ReadOnly = true; // VectorOrHeight = true; extrudeMode = 2; optionalOrg(); } else { Plane pl = p.GetPlane(); pl.Align(base.ActiveDrawingPlane, false, true); // planeVector = pl.Normal; vector = height * pl.Normal; vectorOffset = heightOffset * pl.Normal; } } if (!vectorOffset.IsNullVector()) { ModOp m = ModOp.Translate(vectorOffset); p.Modify(m); } IGeoObject shape; if (pipePath == null) { shape = Make3D.MakePrism(p, vector, Frame.Project, true); } else { shape = Make3D.MakePipe(p, pipePath, Frame.Project); } if (shape != null) { // shape.CopyAttributes(iGeoObjectSel as IGeoObject); shape.CopyAttributes(blk); // die Attribute müssen vom Block übernommen werden shapeList[i] = shape; // fertiger Körper in shapeList blk.Add(shape); // zum Darstellen base.FeedBack.AddSelected(p); // zum Markieren des Ursprungsobjekts success = true; } } // VectorOrHeight = VectorOrHeightTemp; } extrudeMode = extrudeModeTemp; if (success) { base.ActiveObject = blk; // darstellen base.ShowActiveObject = true; return(true); } else { optionalOrg(); heightInput.ReadOnly = false; base.ShowActiveObject = false; base.FeedBack.ClearSelected(); return(false); } }
private bool extrudeOrg() { if (selectedObjectsList == null) { return(false); } IGeoObject iGeoObjectSel; // IGeoObject iGeoObjectOrg; blk = Block.Construct(); // zur Darstellung if (base.ActiveObject != null) { blk.CopyAttributes(base.ActiveObject); } // der block wird das neue aktive Objekt, er muss die Attribute tragen, weil sie später // wieder von ihm verlangt werden blk.IsTmpContainer = true; Boolean success = false; // hat er wenigstens eins gefunden int extrudeModeTemp = extrudeMode; // Merker, da extrudeMode evtl. umgeschaltet wird Plane pln; CompoundShape dbg = CompoundShape.CreateFromList(selectedObjectsList, Precision.eps, out pln); for (int i = 0; i < selectedObjectsList.Count; i++) // läuft über alle selektierten Objekte. Evtl nur eins bei Konstruktion { IGeoObject iGeoObjectTemp = null; // lokaler Merker extrudeMode = extrudeModeTemp; iGeoObjectSel = selectedObjectsList[i]; // zur Vereinfachung geoObjectOrgList[i] = iGeoObjectSel; // zum Weglöschen des Originals in onDone ownerList[i] = iGeoObjectSel.Owner; // owner merken für löschen pathCreatedFromModelList[i] = null; shapeList[i] = null; // Boolean VectorOrHeightTemp = VectorOrHeight; if ((iGeoObjectSel is Face) || (iGeoObjectSel is Shell)) { // nur kopieren iGeoObjectTemp = iGeoObjectSel.Clone(); } else { if (iGeoObjectSel is ICurve) { Path p = null; p = CADability.GeoObject.Path.CreateFromModel(iGeoObjectSel as ICurve, base.Frame.ActiveView.Model, Frame.ActiveView.Projection, true); if (p == null) { // also nur Einzelelement if (iGeoObjectSel is Path) { // schon fertig p = iGeoObjectSel.Clone() as Path; } else { // Pfad aus Einzelobjekt machen: p = Path.Construct(); if (iGeoObjectSel is Polyline) { p.Set(new ICurve[] { iGeoObjectSel.Clone() as ICurve }); p.Flatten(); } else if (iGeoObjectSel is Ellipse && !(iGeoObjectSel as Ellipse).IsArc) { Ellipse elli = iGeoObjectSel as Ellipse; p.Set(elli.Split(0.5)); // zwei Halbkreise } else { p.Set(new ICurve[] { iGeoObjectSel.Clone() as ICurve }); } } } else { // CreateFromModel hat was zusammengesetzt if (p.IsClosed) { // iGeoObjectOrg = null; // zum nicht Weglöschen des Originals in onDone geoObjectOrgList[i] = null; // zum nicht Weglöschen des Originals in onDone pathCreatedFromModelList[i] = p; // kopie merken für onDone p = p.Clone() as Path; p.Flatten(); } } if (p.IsClosed) { // jetzt face machen iGeoObjectTemp = Make3D.MakeFace(p, Frame.Project); } } } if (iGeoObjectTemp != null) { // also was geeignetes dabei if (planeMode) // Objektebene soll Grundlage sein { Face faceTemp = null; if (iGeoObjectTemp is Face) { faceTemp = (iGeoObjectTemp as Face); } if ((iGeoObjectTemp is Shell) && ((iGeoObjectTemp as Shell).Faces.Length == 1)) { faceTemp = (iGeoObjectTemp as Shell).Faces[0]; } if (faceTemp != null) { if (faceTemp.Surface is PlaneSurface) { GeoVector faceNormal = faceTemp.Surface.GetNormal(GeoPoint2D.Origin); // GeoVector temp = base.ActiveDrawingPlane.ToLocal(faceNormal); // die ActiveDrawingPlane ändert sich wenn immer der Cursor durch ein Fenster bewegt wird // das hat manchmal komische Effekte. deshalb hier die etwas statischere // ActiveView.Projection.DrawingPlane verwenden GeoVector temp = base.Frame.ActiveView.Projection.DrawingPlane.ToLocal(faceNormal); if (temp.z < 0.0) { faceNormal.Reverse(); } vector = height * faceNormal; vectorOffset = heightOffset * faceNormal; } else { heightInput.ReadOnly = true; extrudeMode = 2; // VectorOrHeight = true; optionalOrg(); } } } if (!vectorOffset.IsNullVector()) { ModOp m = ModOp.Translate(vectorOffset); iGeoObjectTemp.Modify(m); } // IGeoObject shape = Make3D.MakePrism(iGeoObjectTemp, vector, Frame.Project); IGeoObject shape; if (pipePath == null) { shape = Make3D.MakePrism(iGeoObjectTemp, vector, Frame.Project, false); } else { shape = Make3D.MakePipe(iGeoObjectTemp, pipePath, Frame.Project); } if (shape != null) { // shape.CopyAttributes(iGeoObjectSel as IGeoObject); shape.CopyAttributes(blk); // die Attribute müssen vom Block übernommen werden shapeList[i] = shape; // fertiger Körper in shapeList blk.Add(shape); // zum Darstellen base.FeedBack.AddSelected(iGeoObjectTemp); // zum Markieren des Ursprungsobjekts success = true; } } // VectorOrHeight = VectorOrHeightTemp; } // for-Schleife über die Objekte der Liste extrudeMode = extrudeModeTemp; if (success) { base.ActiveObject = blk; // darstellen base.ShowActiveObject = true; return(true); } else { optionalOrg(); heightInput.ReadOnly = false; base.ShowActiveObject = false; base.FeedBack.ClearSelected(); return(false); } }