예제 #1
0
        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);
            }
        }
예제 #2
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);
            }
        }