public override void OnDone() { // ist die Shift Taste gehalten, so werden Kopien gemacht, d.h. der die Elemente // des blocks werden eingefügt. Ansonsten werden die original-Objekte verändert // TODO: Feedback über Cursor bei Shift-Taste fehlt noch // TODO: die neuen oder veränderten Objekte sollten markiert sein. using (Frame.Project.Undo.UndoFrame) { ModOp m = ModOp.Translate(offset); if (((Frame.UIService.ModifierKeys & Keys.Shift) != 0) || copyObject) { GeoObjectList cloned = new GeoObjectList(); foreach (IGeoObject go in originals) { IGeoObject cl = go.Clone(); cl.Modify(m); // go.Owner.Add(cl); cloned.Add(cl); } base.Frame.Project.GetActiveModel().Add(cloned); } else { originals.Modify(m); } } base.ActiveObject = null; // damit es nicht gleich eingefügt wird base.OnDone(); }
/// <summary> /// Overrides <see cref="CADability.GeoObject.ISurfaceImpl.Make3dCurve (ICurve2D)"/> /// </summary> /// <param name="curve2d"></param> /// <returns></returns> public override ICurve Make3dCurve(CADability.Curve2D.ICurve2D curve2d) { if (curve2d is Curve2DAspect) { ICurve res = (curve2d as Curve2DAspect).Get3DCurve(this); if (res != null) { return(res); } } if (curve2d is ProjectedCurve pc) { if (pc.Surface is PlaneSurface) { BoundingRect otherBounds = new BoundingRect(PositionOf(pc.Surface.PointAt(pc.StartPoint)), PositionOf(pc.Surface.PointAt(pc.EndPoint))); if (pc.Surface.SameGeometry(pc.GetExtent(), this, otherBounds, Precision.eps, out ModOp2D notneeded)) { return(pc.Curve3DFromParams); // if trimmed or reversed still returns the correct 3d curve (but trimmed and/or reversed) } } } IGeoObject go = curve2d.MakeGeoObject(Plane.XYPlane); go.Modify(fromUnitPlane); return(go as ICurve); }
ICurve ICurve.CloneModified(ModOp m) { IGeoObject clone = Clone(); clone.Modify(m); return((ICurve)clone); }
/// <summary> /// While the normal <see cref="HitTest(Projection.PickArea, bool)">HitTest</see> only checkes the <see cref="Location"/> of the object /// this method checks the hittest of the object expanded according to the projection in this <paramref name="area"/> /// </summary> /// <param name="area">Pick area to check</param> /// <param name="onlyInside">true, if the whole object must reside inside the pickarea, false if overlapping will suffice</param> /// <returns>true when a hit is recognized</returns> public bool RealHitTest(Projection.PickArea area, bool onlyInside) { ModOp m = ModOp.Translate(location.x, location.y, location.z) * ModOp.Scale(area.Projection.DeviceToWorldFactor); IGeoObject clone = geoObject.Clone(); clone.Modify(m); return(clone.HitTest(area, onlyInside)); }
public override void OnDone() { // ist die Shift Taste gehalten, so werden Kopien gemacht, d.h. der die Elemente // des blocks werden eingefügt. Ansonsten werden die original-Objekte verändert // TODO: Feedback über Cursor bei Shift-Taste fehlt noch // TODO: die neuen oder veränderten Objekte sollten markiert sein. using (Frame.Project.Undo.UndoFrame) { ModOp m; if (!dis) { m = ModOp.Scale(base.BasePoint, faktor); // ein faktor für alle! } else { // 3 Faktoren für 3 Achsen m = ModOp.Scale(base.BasePoint, base.ActiveDrawingPlane.DirectionX, faktorX) * ModOp.Scale(base.BasePoint, base.ActiveDrawingPlane.DirectionY, faktorY) * ModOp.Scale(base.BasePoint, base.ActiveDrawingPlane.Normal, faktorZ); } if (!Precision.IsNull(Math.Abs(m.Determinant))) { if (((Frame.UIService.ModifierKeys & Keys.Shift) != 0) || copyObject) { GeoObjectList cloned = new GeoObjectList(); foreach (IGeoObject go in originals) { IGeoObject cl = go.Clone(); cl.Modify(m); cloned.Add(cl); } base.Frame.Project.GetActiveModel().Add(cloned); } else { originals.Modify(m); } } } base.ActiveObject = null; // damit es nicht gleich eingefügt wird base.OnDone(); }
public override void OnDone() { // wird aufgerufen, wenn alle Eingaben vollständig gegeben wurden // ist die Shift Taste gehalten, so werden Kopien gemacht, d.h. modifizierte Kopien // der Originalobjekte werden eingefügt. Ansonsten werden die original-Objekte verändert using (Frame.Project.Undo.UndoFrame) // damit es rückgängig gemacht werden kann { if (((Frame.UIService.ModifierKeys & Keys.Shift) != 0) || copyObject) { // es soll eine Kopie erstellt werden foreach (IGeoObject go in originals) { IGeoObject cl = go.Clone(); cl.Modify(m); base.Frame.Project.GetActiveModel().Add(cl); // Kopie in das Modell einfügen } } else { originals.Modify(m); // alle Originalobjekte modifizeiern } } base.ActiveObject = null; // damit das aktive Objekt nicht eingefügt wird. Es diente nur zur Darstellung währen der Aktion base.OnDone(); // wichtig: Basisimplementierung aufrufen }
private void AddPrimitiveToBlock(Block addTo, Layer layer, ColorDef colorDef, ModOp mod, IGeoObject toAdd) { if (toAdd is BlockRef) { BlockRef br = (toAdd as BlockRef); AddPrimitiveToBlock(addTo, br.Layer, br.ColorDef, mod * br.insertion, br.idea); } else if (toAdd is Hatch && toAdd.NumChildren == 0) { // sonst kann man in ERSACAD nicht per drag and drop verschieben IGeoObject clone = toAdd.Clone(); // das ist ja jetzt ein Primitives if (clone is ILayer) { if (clone.Layer == null) { clone.Layer = layer; } } if (clone is IColorDef) { if ((clone as IColorDef).ColorDef == null) { (clone as IColorDef).ColorDef = colorDef; } } clone.Modify(mod); addTo.Add(clone); } else if (toAdd is Block) { Block blk = (toAdd as Block); Layer l = blk.Layer; ColorDef c = blk.ColorDef; if (l == null) { l = layer; } if (c == null) { c = colorDef; } for (int i = 0; i < blk.Children.Count; i++) { AddPrimitiveToBlock(addTo, l, c, mod, blk.Child(i)); } } else { IGeoObject clone = toAdd.Clone(); // das ist ja jetzt ein Primitives if (clone is ILayer) { if (clone.Layer == null) { clone.Layer = layer; } } if (clone is IColorDef) { if ((clone as IColorDef).ColorDef == null) { (clone as IColorDef).ColorDef = colorDef; } } clone.Modify(mod); addTo.Add(clone); } }
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); } }