Пример #1
0
 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();
 }
Пример #2
0
        /// <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);
        }
Пример #3
0
        ICurve ICurve.CloneModified(ModOp m)
        {
            IGeoObject clone = Clone();

            clone.Modify(m);
            return((ICurve)clone);
        }
Пример #4
0
        /// <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));
        }
Пример #5
0
 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();
 }
Пример #6
0
 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
 }
Пример #7
0
 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);
     }
 }
Пример #8
0
        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);
            }
        }