private void ApplyCut()
        {
            var cutType  = cutBuilder[2].Integer;
            var cutDepth = cutBuilder[1].Real;

            Document.Transact();
            var sketchNode = AutoGroupLogic.FindSketchNode(_selectedNode.Node);

            // Apply Cut on it
            cutBuilder = new NodeBuilder(TreeUtils.Cut(Document, sketchNode, cutDepth, cutType == 0? CutTypes.ToDepth:CutTypes.ThroughAll));
            if (cutBuilder == null)
            {
                Document.Revert();
            }
            else
            {
                cutBuilder.ExecuteFunction();
                NodeUtils.SetSketchTransparency(Document, sketchNode, ObjectVisibility.Hidden);
                // Commit
                Document.Commit("Apply Cut");
                UpdateView();
                AddNodeToTree(cutBuilder.Node);
                ResetWorkingPlane();
            }
            Inputs[InputNames.FacePickerPlane].Send(NotificationNames.Resume);
            BackToNeutralModifier();
            //Inputs[InputNames.FacePickerPlane].Send(NotificationNames.Resume);
        }
Exemple #2
0
        public static List <Node> GetVisibleSketchNodes(Document document)
        {
            var results      = new List <Node>();
            var visibleNodes = new List <Node>();
            var root         = document.Root;
            var found        = true;

            while (found)
            {
                found = false;
                results.AddRange(from node in root.ChildrenList
                                 let builder = new NodeBuilder(node)
                                               where FunctionNames.GetSketchShapes().Contains(builder.FunctionName)
                                               select node);
            }
            var sketchNodes = new Dictionary <Node, bool>();

            foreach (var node in results)
            {
                var sketchNode = AutoGroupLogic.FindSketchNode(node);
                if (!sketchNodes.ContainsKey(sketchNode))
                {
                    int index;
                    sketchNodes.Add(sketchNode, SketchHas3DApplied(document, sketchNode, out index));
                }
                if (!sketchNodes[sketchNode])
                {
                    visibleNodes.Add(node);
                }
            }
            return(visibleNodes);
        }
        public static void AddRectangleToNode(Document document, int point1, int point2)
        {
            if (!document.Root.Children.ContainsKey(point1) || !document.Root.Children.ContainsKey(point2))
            {
                return;
            }
            var sketchNode = AutoGroupLogic.FindSketchNode(document.Root[point1]);
            var axis       = new gpAx2();

            axis.Axis = (sketchNode.Children[1].Get <Axis3DInterpreter>().Axis.GpAxis);
            var pointLinker   = new SketchCreator(document).PointLinker;
            var point3Ds      = new List <Point3D>();
            var nb1           = new NodeBuilder(document.Root[point1]);
            var nb2           = new NodeBuilder(document.Root[point2]);
            var _firstPoint   = nb1.Dependency[1].TransformedPoint3D;
            var _secondPoint  = nb2.Dependency[1].TransformedPoint3D;
            var firstPoint2D  = _firstPoint.ToPoint2D(axis);
            var secondPoint2D = _secondPoint.ToPoint2D(axis);
            var x1            = firstPoint2D.X;
            var y1            = firstPoint2D.Y;
            var x2            = secondPoint2D.X;
            var y2            = secondPoint2D.Y;

            point3Ds.Add(GeomUtils.Point2DTo3D(axis, x1, y1));
            point3Ds.Add(GeomUtils.Point2DTo3D(axis, x2, y1));
            point3Ds.Add(GeomUtils.Point2DTo3D(axis, x2, y2));
            point3Ds.Add(GeomUtils.Point2DTo3D(axis, x1, y2));
            document.Root.Remove(nb1.Node.Index);
            document.Root.Remove(nb2.Node.Index);
            BuildLine(document, pointLinker, point3Ds[0], point3Ds[1]);
            BuildLine(document, pointLinker, point3Ds[1], point3Ds[2]);
            BuildLine(document, pointLinker, point3Ds[2], point3Ds[3]);
            BuildLine(document, pointLinker, point3Ds[3], point3Ds[0]);
        }
Exemple #4
0
        public override void UpdatePointPosition(int index, Mouse3DPosition vertex)
        {
            var nodeBuilder = new NodeBuilder(Node);


            if (nodeBuilder.FunctionName == FunctionNames.Trim)
            {
                return;
            }
            var gravityCenter    = GeomUtils.ExtractGravityCenter(nodeBuilder.Shape);
            var newPoint         = GetPointForIndex(vertex.Point, gravityCenter, index);
            var mouseTranslation = GeomUtils.BuildTranslation((gravityCenter), newPoint);
            var translateValue   = newPoint.SubstractCoordinate(gravityCenter);
            var document         = Dependency[0].Node.Root.Get <DocumentContextInterpreter>().Document;

            if (!NodeUtils.NodeIsOnSketch(nodeBuilder))
            {
                NodeUtils.Translate3DNode(nodeBuilder, document, translateValue);//, gravityCenter);
            }
            else
            {
                var sketchNode = AutoGroupLogic.FindSketchNode(Node);
                NodeUtils.TranslateSketchNode(nodeBuilder, translateValue, sketchNode);// mouseTranslation);

                var constraintMapper = new ConstraintDocumentHelper(document, sketchNode);
                constraintMapper.SetMousePosition(Dependency[0].Reference.Index);
                var error = constraintMapper.ImpactAndSolve(Dependency[0].Node.Get <ReferenceInterpreter>().Node);
            }
        }
        private Point3D ExtractCenterAndRadius(Node node, ref double radius)
        {
            var nb = new NodeBuilder(node);

            if (node.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.Arc)
            {
                var P1 = nb.Dependency[0].RefTransformedPoint3D;
                var P2 = nb.Dependency[1].RefTransformedPoint3D;
                radius = Math.Sqrt((P1.X - P2.X) * (P1.X - P2.X) + (P1.Y - P2.Y) * (P1.Y - P2.Y) + (P1.Z - P2.Z) * (P1.Z - P2.Z));
                return(P1);
            }
            if (node.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.Circle)
            {
                radius = nb.Dependency[1].Real;
                return(nb.Dependency[0].RefTransformedPoint3D);
            }
            if (node.Get <ShapeFunctionsInterface.Functions.FunctionInterpreter>().Name == FunctionNames.Arc3P)
            {
                var sketchNode = AutoGroupLogic.FindSketchNode(node);
                var sketchAx2  = GeomUtils.ExtractSketchNormal(sketchNode);
                var P1         = GeomUtils.Point3DTo2D(sketchAx2, nb.Dependency[0].RefTransformedPoint3D);
                var P2         = GeomUtils.Point3DTo2D(sketchAx2, nb.Dependency[1].RefTransformedPoint3D);
                var P3         = GeomUtils.Point3DTo2D(sketchAx2, nb.Dependency[2].RefTransformedPoint3D);

                var center = GeomUtils.CircleCenter(P1, P2, P3);
                radius = Math.Sqrt((P1.X - center.X) * (P1.X - center.X) + (P1.Y - center.Y) * (P1.Y - center.Y));
                var centerPoint = GeomUtils.Point2DTo3D(sketchAx2, center);
                return(new Point3D(centerPoint));
            }
            return(new Point3D(0, 0, 0));
        }
Exemple #6
0
        public static List <Node> GetSketchNodes(Node sketchNode, Document document, bool includeAuxiliaryNodes)
        {
            var results       = new List <Node>();
            var root          = document.Root;
            var found         = true;
            var functionNames = new List <string> {
                FunctionNames.Circle, FunctionNames.Ellipse, FunctionNames.LineTwoPoints, FunctionNames.Arc, FunctionNames.Arc3P, FunctionNames.Point
            };

            if (includeAuxiliaryNodes)
            {
                functionNames.Add(FunctionNames.LineHints);
            }
            while (found)
            {
                found = false;
                results.AddRange(from node in root.ChildrenList
                                 let builder = new NodeBuilder(node)
                                               where functionNames.Contains(builder.FunctionName)
                                               let currentSketchNode = AutoGroupLogic.FindSketchNode(node)
                                                                       where currentSketchNode.Index == sketchNode.Index
                                                                       select node);
            }
            return(results);
        }
Exemple #7
0
        protected override void OnMouseUpAction(Mouse3DPosition mouseData)
        {
            base.OnMouseUpAction(mouseData);
            _dragging = false;

            if (_extrudeStages == ExtrudeStages.SelectSketch)
            {
                var entities = Inputs[InputNames.SelectionContainerPipe].GetData(NotificationNames.GetEntities).Get
                               <List <SceneSelectedEntity> >();
                if (entities.Count <= 0)
                {
                    return;
                }

                _sketchNode = AutoGroupLogic.FindSketchNode(entities[0].Node);
                Ensure.IsNotNull(_sketchNode);

                PreviewExtrudes(true);
                _extrudeStages = ExtrudeStages.SelectAutoFace;
                Inputs[InputNames.FacePickerPlane].Send(NotificationNames.Resume);
            }
            else if (_extrudeStages == ExtrudeStages.SelectAutoFace)
            {
                ProposeSelectedReferenceShape(_underMouseFace, mouseData);
                PreviewExtrudes(true);
                _extrudeStages = ExtrudeStages.ExtrudeAnimation;
            }
            else if (_extrudeStages == ExtrudeStages.ExtrudeAnimation)
            {
            }
        }
Exemple #8
0
        public static List <Node> GetSketchPoints(Node sketchNode, Document document)
        {
            var results = new List <Node>();
            var root    = document.Root;
            var found   = true;

            while (found)
            {
                found = false;
                results.AddRange(from node in root.ChildrenList
                                 let builder = new NodeBuilder(node)
                                               where builder.FunctionName == FunctionNames.Point
                                               let currentSketchNode = AutoGroupLogic.FindSketchNode(node)
                                                                       where currentSketchNode.Index == sketchNode.Index
                                                                       select node);
            }
            return(results);
        }
        public CutDialog(Document document, V3dView view, SceneSelectedEntity sceneSelectedEntity)
        {
            InitializeComponent();
            _document = document;
            _view     = view;

            var selNode    = sceneSelectedEntity.Node;
            var sketchNode = AutoGroupLogic.FindSketchNode(selNode);

            _cutNode = new NodeBuilder(document, FunctionNames.Cut);
            _cutNode[0].Reference = sketchNode;

            cutTypeComboBox.Items.Add(CutThroughAll);
            cutTypeComboBox.Items.Add(CutToDepth);
            cutTypeComboBox.SelectedIndex = 0;

            CutDepth = 100;


            UpdateView();
        }
        protected override bool ApplyFunction()
        {
            var  builder    = new NodeBuilder(Document, FunctionNames.Revolve);
            var  sketchNode = AutoGroupLogic.FindSketchNode(FirstShape);
            Node node       = FirstShape;

            if (sketchNode != null)
            {
                if (sketchNode.Children[2].Get <MeshTopoShapeInterpreter>() == null)
                {
                    var tempFace = AutoGroupLogic.RebuildSketchFace(sketchNode, Document);
                    if (tempFace != null)
                    {
                        sketchNode.Children[2].Set <MeshTopoShapeInterpreter>().Shape = tempFace;
                        NodeUtils.SetSketchTransparency(Document, sketchNode, ObjectVisibility.Hidden);
                        sketchNode.Set <DrawingAttributesInterpreter>().Transparency = 1;
                        sketchNode.Set <DrawingAttributesInterpreter>().Visibility   = ObjectVisibility.Hidden;
                        Document.Commit("Sketch face generated");
                        node = sketchNode;
                    }
                }
                else
                {
                    node = sketchNode;
                }
            }
            builder[0].Reference = node;
            builder[1].Reference = SecondShape;
            builder[2].Real      = 360.0;
            if (builder.ExecuteFunction())
            {
                AddNodeToTree(builder.Node);
                if (node == sketchNode)
                {
                    NodeUtils.SetSketchTransparency(Document, sketchNode, ObjectVisibility.Hidden);
                }
                return(true);
            }
            return(false);
        }
        public static void AddArrayPatternNodes(Document document, int axis, int columnAxis, int shape, int rows, int columns, int rowDistance, int colDistance)
        {
            var indexColomns   = 1;
            var node           = document.Root[shape];
            var axisNode       = document.Root[axis];
            var _axis          = GeomUtils.ExtractAxis(new NodeBuilder(axisNode).Shape);
            var columnAxisNode = document.Root[columnAxis];
            var _ColumnAxis    = GeomUtils.ExtractAxis(new NodeBuilder(columnAxisNode).Shape);
            var reverseRows    = 1;
            var reverseColumns = 1;

            for (var indexRows = 0; indexRows < rows; indexRows++)
            {
                for (; indexColomns < columns; indexColomns++)
                {
                    var sourceCopyBuilder = new NodeBuilder(Document.CopyPaste(node));
                    sourceCopyBuilder.ShapeName = "Patterned" +
                                                  sourceCopyBuilder.ShapeName.Substring(0, sourceCopyBuilder.ShapeName.
                                                                                        Length - 1) +
                                                  (indexRows * columns + indexColomns);
                    sourceCopyBuilder.Node.Set <DrawingAttributesInterpreter>().Visibility = ObjectVisibility.ToBeDisplayed;
                    var transformInterpreter = sourceCopyBuilder.Node.Get <TransformationInterpreter>();
                    transformInterpreter.ApplyGeneralArrayPattern(_axis, _ColumnAxis, indexRows * rowDistance * reverseRows,
                                                                  indexColomns * colDistance * reverseColumns);
                }
                indexColomns = 0;
            }

            var slectedNode = node;
            var sketchNode  = AutoGroupLogic.FindSketchNode(slectedNode);

            NodeUtils.SetSketchTransparency(document, sketchNode, 0);

            var face = AutoGroupLogic.RebuildSketchFace(sketchNode, document);

            sketchNode.Children[2].Set <MeshTopoShapeInterpreter>().Shape = face;
            sketchNode.Set <DrawingAttributesInterpreter>().Transparency  = 1;
            sketchNode.Set <DrawingAttributesInterpreter>().Visibility    = ObjectVisibility.Hidden;
            NodeUtils.SetSketchTransparency(document, sketchNode, 0);
        }
        public void GetSketchNodeTest()
        {
            var document = TestUtils.DefaultsSetup();

            document.Transact();

            var sketchCreator = new SketchCreator(document, false);
            var sketchNode    = sketchCreator.BuildSketchNode();

            var line = TestUtils.Line(document, sketchNode, new Point3D(10, 10, 0), new Point3D(10, 0, 0));

            Assert.IsTrue(line.LastExecute);

            var sketchCreator2 = new SketchCreator(document, false);
            var sketchNode2    = sketchCreator2.BuildSketchNode();

            var circle = TestUtils.Circle(document, sketchNode2, new Point3D(0, 0, 0), 5);

            Assert.IsTrue(circle.ExecuteFunction());

            var sphereBuilder = new NodeBuilder(document, FunctionNames.Sphere);

            sphereBuilder[0].TransformedPoint3D = new Point3D(10, 10, 0);
            sphereBuilder[1].Real = 3;
            Assert.IsTrue(sphereBuilder.ExecuteFunction());

            var firstNode = new NodeBuilder(AutoGroupLogic.FindSketchNode(line.Node));

            Assert.AreEqual(firstNode.FunctionName, FunctionNames.Sketch);
            Assert.AreEqual(firstNode.ShapeName, "Sketch-1");

            var secondNode = new NodeBuilder(AutoGroupLogic.FindSketchNode(circle.Node));

            Assert.AreEqual(secondNode.FunctionName, FunctionNames.Sketch);
            Assert.AreEqual(secondNode.ShapeName, "Sketch-2");

            Assert.IsNull(AutoGroupLogic.FindSketchNode(sphereBuilder.Node));
        }
Exemple #13
0
        private void UpdatePoints()
        {
            var root       = this.Builder.Node.Root;
            var pointNodes = from node in root.ChildrenList
                             let builder = new NodeBuilder(node)
                                           where builder.FunctionName == FunctionNames.Point
                                           let currentSketchNode = AutoGroupLogic.FindSketchNode(node)
                                                                   where currentSketchNode.Index == this.Builder.Node.Index
                                                                   select node;
            var points    = pointNodes.ToList();
            var sketchAx2 = new gpAx2 {
                Axis = NodeBuilderUtils.GetTransformedAxis(Builder)
            };
            var sketchPlane = new gpPln(new gpAx3(sketchAx2));

            foreach (var point in points)
            {
                var nb             = new NodeBuilder(point);
                var current        = nb[1].TransformedPoint3D;
                var projectedPlane = GeomUtils.ProjectPointOnPlane(current.GpPnt, sketchPlane, Precision.Confusion);
                nb[1].TransformedPoint3D = new Point3D(projectedPlane);
                nb.ExecuteFunction();
            }
        }
Exemple #14
0
        /// <summary>
        /// Called when Enter Sketch is pressed. If a node is selected in the tree or a shape is selected on the drawing stage,
        /// the sketch containing that node/shape is selected for editing, otherwise a new sketch will be created in OnMouseDownAction
        /// </summary>
        public override void OnActivate()
        {
            base.OnActivate();
            if (Document.Root.Children.Count > 0)
            {
                Inputs[InputNames.SelectionContainerPipe].Send(NotificationNames.SwitchSelectionMode,
                                                               TopAbsShapeEnum.TopAbs_FACE);
            }
            else
            {
                Inputs[InputNames.SelectionContainerPipe].Send(NotificationNames.SwitchSelectionMode,
                                                               TopAbsShapeEnum.TopAbs_SOLID);
            }
            ActionsGraph[InputNames.CoordinateParser].Send(CoordinatateParserNames.SetStage, ParserStage.Unknown);
            Inputs[InputNames.SelectionContainerPipe].Send(NotificationNames.Enable);
            Inputs[InputNames.FacePickerPlane].Send(NotificationNames.Disable);
            Reset();
            ShowHint(ModelingResources.StartSketch);
            Inputs[InputNames.GeometricSolverPipe].Send(NotificationNames.DisableAll);
            var uiBuilder     = ActionsGraph[InputNames.UiBuilderInput].Get <UiBuilder>();
            var sketchControl = uiBuilder.GetItemAtPath("Ribbon/Modelling/Sketch/Sketch");

            _sketchButton = (ISketchButton)sketchControl;
            var  selected = Inputs[InputNames.SelectionContainerPipe].GetData(NotificationNames.GetEntities).Get <List <SceneSelectedEntity> >();
            Node node     = null;

            if (selected.Count > 0)
            {
                node = selected[0].Node;
            }
            else
            {
                node = Inputs[InputNames.NodeSelect].GetData(NotificationNames.GetValue).Get <Node>();
            }
            if (node != null)
            {
                Node sketchNode = AutoGroupLogic.FindSketchNode(node);

                if (sketchNode != null)
                {
                    Document.Transact();
                    Document.Root.Get <DocumentContextInterpreter>().ActiveSketch = sketchNode.Index;
                    NodeUtils.SetSketchTransparency(Document, sketchNode, 0);
                    Inputs[InputNames.Mouse3DEventsPipe].Send(NotificationNames.Resume);
                    var axis  = new NodeBuilder(sketchNode)[0].TransformedAxis3D;
                    var plane = new gpPln(new gpAx3(axis.Location, axis.Direction));
                    Inputs[InputNames.Mouse3DEventsPipe].Send(NotificationNames.SetPlane, plane);
                    //if (Inputs[InputNames.Mouse3DEventsPipe].GetData(NotificationNames.GetPlane).Data == null)
                    //{
                    //    var plane = new gpPln(new gpAx3());
                    //    Inputs[InputNames.Mouse3DEventsPipe].Send(NotificationNames.SetPlane, plane);
                    //    //ActionsGraph[InputNames.View].Send(NotificationNames.SwitchView, plane);
                    //}
                    _sketchButton.Block();
                    HighlightCurrentSketchNodes(sketchNode);
                    Document.Commit("Started editing sketch");
                    BackToNeutralModifier();

                    Log.Info("StartSketch - current sketch exists");
                    _sketchButton.Block();
                    return;
                }
            }
            if (Document.Root.Children.Count == 0)
            {
                CreatePlane(new Point3D(-20, -10, 0), new Point3D(20, -10, 0),
                            new Point3D(20, 10, 0), new Point3D(-20, 10, 0), "Top");
                CreatePlane(new Point3D(-20, 0, -10), new Point3D(20, 0, -10),
                            new Point3D(20, 0, 10), new Point3D(-20, 0, 10), "Right");
                CreatePlane(new Point3D(0, -20, -10), new Point3D(0, 20, -10),
                            new Point3D(0, 20, 10), new Point3D(0, -20, 10), "Front");
                Document.Commit("Default planes created");
            }
            Inputs[InputNames.FacePickerPlane].Send(NotificationNames.Enable);
            Inputs[InputNames.SelectionContainerPipe].Send(NotificationNames.SwitchSelectionMode,
                                                           TopAbsShapeEnum.TopAbs_FACE);
            Inputs[InputNames.Mouse3DEventsPipe].Send(NotificationNames.Resume);
            var sketchCreator = new SketchCreator(Document, false);

            if (sketchCreator.CurrentSketch == null)
            {
                ShowHint(ModelingResources.StartSketch);
                Log.Info("StartSketch - no current sketch");
            }
        }
        protected override void OnMouseUpAction(Mouse3DPosition mouseData)
        {
            base.OnMouseUpAction(mouseData);

            if (_extrudeStages == ExtrudeStages.SelectSketch)
            {
                var entities = Inputs[InputNames.SelectionContainerPipe].GetData(NotificationNames.GetEntities).Get
                               <List <SceneSelectedEntity> >();
                if (entities.Count <= 0)
                {
                    return;
                }

                _sketchNode = AutoGroupLogic.FindSketchNode(entities[0].Node);
                if (_sketchNode == null)
                {
                    return;
                }
                if (_sketchNode.Children[2].Get <MeshTopoShapeInterpreter>() == null)
                {
                    // the sketch shape was not generated - this is the case when we open a file and perform extrude without any edits
                    var tempFace = AutoGroupLogic.RebuildSketchFace(_sketchNode, Document);
                    if (tempFace == null)
                    {
                        return;
                    }
                    _sketchNode.Children[2].Set <MeshTopoShapeInterpreter>().Shape = tempFace;
                    NodeUtils.SetSketchTransparency(Document, _sketchNode, ObjectVisibility.Hidden);
                    _sketchNode.Set <DrawingAttributesInterpreter>().Transparency = 1;
                    _sketchNode.Set <DrawingAttributesInterpreter>().Visibility   = ObjectVisibility.Hidden;
                    Document.Commit("Sketch face generated");
                }

                var face = _sketchNode.Children[2].Get <MeshTopoShapeInterpreter>().Shape;

                _shapePlane = GeomUtils.ExtractPlane(face);
                PreviewExtrude(false, mouseData);
                ResetWorkingPlane();
                Inputs[InputNames.SelectionContainerPipe].Send(NotificationNames.Disable);
                _extrudeStages = ExtrudeStages.ExtrudeAnimation;
            }
            else if (_extrudeStages == ExtrudeStages.ExtrudeAnimation)
            {
                var sketchBuilder = new NodeBuilder(_sketchNode);
                var extrudeHeight = sketchBuilder[0].Axis3D.Location.Distance(mouseData.Point);
                if (extrudeHeight < 1e-12)
                {
                    return;
                }
                PreviewExtrude(false, mouseData);
                NodeUtils.SetSketchTransparency(Document, _sketchNode, ObjectVisibility.Hidden);
                CommitFinal("Extrudes build");
                Inputs[InputNames.FacePickerPlane].Send(NotificationNames.Resume);

                //Inputs[InputNames.SelectionContainerPipe].Send(NotificationNames.SwitchSelectionMode,
                //                                                TopAbsShapeEnum.TopAbs_SOLID);
                RebuildTreeView();
                UpdateView();
                BackToNeutralModifier();
            }
        }
Exemple #16
0
        private void MouseClickHandler(Mouse3DPosition mousePosition)
        {
            if (!Enabled)
            {
                return;
            }
            var matchingSketches = new List <int>();

            if (mousePosition.MouseDown == false)
            {
                var linesEdges = (from line in lines where line != null && line.Shape != null select GeomUtils.ExtractEdge(line.Shape)).ToList();
                _document.Revert();

                // continue only if we have a drag action
                if (Math.Abs(mousePosition.Initial2Dx - startX) < 3 && Math.Abs(mousePosition.Initial2Dy - startY) < 3)
                {
                    return;
                }
                bool leftToRight = startX < mousePosition.Initial2Dx ? true : false;

                if (selectionFace == null)
                {
                    return;
                }
                var sketchNodes = NodeUtils.GetDocumentNodesOfType(_document, FunctionNames.Sketch);

                // find all sketches that are on the same plane as the selection
                matchingSketches.AddRange(from sketchNodeIndex in sketchNodes
                                          let nb = new NodeBuilder(_document.Root[sketchNodeIndex])
                                                   let normal = nb.Dependency[0].TransformedAxis3D
                                                                where normal.IsParallel(viewPlane.Axis, Precision.Confusion)
                                                                select sketchNodeIndex);

                var pointsToShapeMapping = new Dictionary <int, List <int> >();
                var shapeToPointMapping  = new Dictionary <int, List <int> >();
                var functionNames        = new List <string> {
                    FunctionNames.Circle, FunctionNames.Ellipse, FunctionNames.LineTwoPoints, FunctionNames.Arc, FunctionNames.Arc3P
                };
                var selectedShapes = new List <int>();
                foreach (var index in matchingSketches)
                {
                    var sketchPoints = NodeUtils.GetSketchPoints(_document.Root[index], _document);
                    // find all shapes and points on the matching sketches
                    foreach (var node in _document.Root.Children)
                    {
                        var builder = new NodeBuilder(node.Value);
                        if (functionNames.Contains(builder.FunctionName))
                        {
                            var currentSketchNode = AutoGroupLogic.FindSketchNode(node.Value);
                            if (currentSketchNode.Index == index)
                            {
                                if (builder.FunctionName == FunctionNames.Circle)
                                {
                                    if (!pointsToShapeMapping.ContainsKey(builder.Dependency[0].Node.Index))
                                    {
                                        pointsToShapeMapping.Add(builder.Dependency[0].ReferenceBuilder.Node.Index,
                                                                 new List <int> {
                                            builder.Node.Index
                                        });
                                    }
                                    else
                                    {
                                        pointsToShapeMapping[builder.Dependency[0].ReferenceBuilder.Node.Index].Add(builder.Node.Index);
                                    }

                                    shapeToPointMapping.Add(builder.Node.Index, new List <int> {
                                        builder.Dependency[0].ReferenceBuilder.Node.Index
                                    });
                                }
                                else
                                {
                                    var pointsList = new List <int>();
                                    for (int k = 0; k < builder.Dependency.Count; k++)
                                    {
                                        if (!pointsToShapeMapping.ContainsKey(builder.Dependency[k].ReferenceBuilder.Node.Index))
                                        {
                                            pointsToShapeMapping.Add(builder.Dependency[k].ReferenceBuilder.Node.Index, new List <int> {
                                                builder.Node.Index
                                            });
                                        }
                                        else
                                        {
                                            pointsToShapeMapping[builder.Dependency[k].ReferenceBuilder.Node.Index].Add(builder.Node.Index);
                                        }
                                        pointsList.Add(builder.Dependency[k].ReferenceBuilder.Node.Index);
                                    }
                                    shapeToPointMapping.Add(builder.Node.Index, pointsList);
                                }
                            }

                            var edge = GeomUtils.ExtractEdge(builder.Shape);
                            if (edge != null && !edgeMappings.ContainsKey(builder.Node.Index))
                            {
                                edgeMappings.Add(builder.Node.Index, edge);
                            }
                        }
                    }
                    var selectedPoints = new List <int>();

                    // check which points are inside the selection
                    foreach (var point in sketchPoints)
                    {
                        var shapeFace = new NodeBuilder(point).Shape;
                        if (shapeFace == null)
                        {
                            continue;
                        }
                        var common = new BRepAlgoAPICommon(selectionFace, shapeFace);
                        if (common.IsDone)
                        {
                            var commonArea = GeomUtils.GetFaceArea(common.Shape);
                            if (commonArea > 0)
                            {
                                selectedPoints.Add(point.Index);
                            }
                        }
                        _document.Transact();
                    }

                    // Left->Right - only shapes that are fully inside the selection box are selected
                    if (leftToRight)
                    {
                        foreach (var point in selectedPoints)
                        {
                            if (!pointsToShapeMapping.ContainsKey(point))
                            {
                                selectedShapes.Add(point);
                                continue;
                            }
                            var shapes = pointsToShapeMapping[point];
                            foreach (var shape in shapes)
                            {
                                var points = shapeToPointMapping[shape];
                                var allPointsAreSelected = true;
                                foreach (var pointIndex in points)
                                {
                                    if (!selectedPoints.Contains(pointIndex))
                                    {
                                        allPointsAreSelected = false;
                                        break;
                                    }
                                }
                                if (allPointsAreSelected)
                                {
                                    selectedShapes.Add(shape);
                                }
                            }
                        }
                        selectedShapes = selectedShapes.Distinct().ToList();
                    }
                    else
                    {
                        // Right->Left - shapes that are corssed by the selection box are also included in the selection
                        foreach (var point in selectedPoints)
                        {
                            if (pointsToShapeMapping.ContainsKey(point))
                            {
                                selectedShapes.AddRange(pointsToShapeMapping[point]);
                            }
                            else
                            {
                                selectedShapes.Add(point);
                            }
                        }
                        foreach (var edgeMapping in edgeMappings)
                        {
                            if (!selectedShapes.Contains(edgeMapping.Key))
                            {
                                foreach (var line in linesEdges)
                                {
                                    var intersection = GeomUtils.IntersectionPoints(line, edgeMapping.Value);
                                    if (intersection.Count > 0)
                                    {
                                        selectedShapes.Add(edgeMapping.Key);
                                        break;
                                    }
                                }
                            }
                        }
                    }
                }
                selectedShapes = selectedShapes.Distinct().ToList();
                _selectionContainer.BuildSelections(selectedShapes);

                Inputs[InputNames.UiElementsItem].Send(NotificationNames.RefreshPropertyTabMultipleSelections, _selectionContainer.Entities);
                _document.Transact();
                return;
            }

            selectedNodesIndexes.Clear();
            startX     = mousePosition.Initial2Dx;
            startY     = mousePosition.Initial2Dy;
            startPoint = mousePosition.Point;

            var correctedMousePosition = CalculateCorrectCoordinate(mousePosition);

            _context.MoveTo(correctedMousePosition.Initial2Dx, correctedMousePosition.Initial2Dy, ViewItems.View);

            if (mousePosition.MouseDown)
            {
                if (mousePosition.ShiftDown)
                {
                    _context.ShiftSelect(true);
                }
                else
                {
                    _context.Select(true);
                }
            }

            // Perform click selection using the corrected coordinate
            _selectionContainer.BuildSelections(correctedMousePosition);
            if (_selectionContainer.Entities.Count == 2)
            {
                Inputs[InputNames.UiElementsItem].Send(NotificationNames.RefreshPropertyTabTwoSelections, _selectionContainer.Entities);
            }
            if (_selectionContainer.Entities.Count == 1)
            {
                Inputs[InputNames.UiElementsItem].Send(NotificationNames.SelectNode, _selectionContainer.Entities[0].Node);
            }
        }
Exemple #17
0
        public int Solve()
        {
            if (!_shapeList.Any() || !_constraints.Any())
            {
                return(0);
            }
            // transform parameters
            var sketchNode = AutoGroupLogic.FindSketchNode(_document.Root[_shapeList.First()]);
            var axisAll    = NodeBuilderUtils.GetTransformedAxis(new NodeBuilder(sketchNode));
            var sketchAx2  = new gpAx2(axisAll.Location, axisAll.Direction);

            LoadParameters(sketchAx2);
            LoadConstraints();

            if (SetConstraintsList.Size == 0)
            {
                return(0);
            }
            var freeParametersCount    = 1;
            var maxFreeParametersCount = Parameters.Count - 2;

            var error     = 1;
            var dfpSolver = new DFPSolver();

            while (error == 1 && freeParametersCount <= maxFreeParametersCount)
            {
                error = dfpSolver.SolveRef(ref Parameters, freeParametersCount, ConstraintList, 1);
                freeParametersCount++;
            }
            Sketch2DSolver solver;

            if (error == 1)
            {
                var bfgsSolver = new BFGSSolver();
                freeParametersCount = 1;
                while (error == 1 && freeParametersCount <= maxFreeParametersCount)
                {
                    error = bfgsSolver.SolveRef(ref Parameters, freeParametersCount, ConstraintList, 1);
                    freeParametersCount++;
                }
                solver = bfgsSolver;
            }
            else
            {
                solver = dfpSolver;
            }

            if (error == 0)
            {
                // update point position with the values returned by the solver
                int index = 0;
                foreach (var shape in ShapeToParamIndex.Keys)
                {
                    //if (index > maxFreeParametersCount)
                    //    break;
                    var nodeBuilder = new NodeBuilder(_document.Root[shape]);
                    if (nodeBuilder.FunctionName == FunctionNames.Point)
                    {
                        nodeBuilder[1].TransformedPoint3D = GeomUtils.Point2DTo3D(sketchAx2,
                                                                                  Parameters[ShapeToParamIndex[shape]],
                                                                                  Parameters[
                                                                                      ShapeToParamIndex[shape] + 1]);
                        index += 2;
                    }
                    if (nodeBuilder.FunctionName == FunctionNames.Circle)
                    {
                        nodeBuilder[0].RefTransformedPoint3D = GeomUtils.Point2DTo3D(sketchAx2, Parameters[ShapeToParamIndex[shape]], Parameters[ShapeToParamIndex[shape] + 1]);
                        nodeBuilder[1].Real = Parameters[ShapeToParamIndex[shape] + 2];
                        index += 3;
                    }
                }
                foreach (var shape in _document.Root.Children)
                {
                    //if (index > maxFreeParametersCount)
                    //    break;
                    var nodeBuilder = new NodeBuilder(shape.Value);
                    if (nodeBuilder.FunctionName == FunctionNames.Arc)
                    {
                        if (ShapeToParamIndex.Keys.Contains(nodeBuilder.Dependency[0].Reference.Index))
                        {
                            var centre     = nodeBuilder.Dependency[0].RefTransformedPoint3D;
                            var start      = nodeBuilder.Dependency[1].RefTransformedPoint3D;
                            var currentEnd = nodeBuilder.Dependency[2].RefTransformedPoint3D;
                            var newEnd     = GeomUtils.ProjectPointOnCircle(centre, start, currentEnd);
                            if (newEnd != null)
                            {
                                var End = new Point3D(newEnd);
                                nodeBuilder[2].RefTransformedPoint3D = new Point3D(End.X, End.Y, End.Z);
                            }
                        }
                        error = 1;
                        freeParametersCount = 0;
                        while (error == 1 && freeParametersCount <= maxFreeParametersCount)
                        {
                            error = solver.SolveRef(ref Parameters, freeParametersCount, SetConstraintsList, 1);
                            freeParametersCount += 2;
                        }
                    }
                }
            }
            foreach (var constr in softConstraints)
            {
                _document.Root.Remove(constr);
            }
            return(error);
        }
Exemple #18
0
        private List <Node> BuildAutoFaces(Node sketchNode)
        {
            var results = new List <Node>();
            var root    = Document.Root;

            InitSession();
            var found       = true;
            var circleNodes = new List <Node>();

            while (found)
            {
                found = false;
                foreach (var node in root.ChildrenList)
                {
                    var builder = new NodeBuilder(node);

                    if (builder.FunctionName == FunctionNames.Circle || builder.FunctionName == FunctionNames.Ellipse)
                    {
                        var currentSketchNode = AutoGroupLogic.FindSketchNode(node);
                        if (currentSketchNode.Index == sketchNode.Index)
                        {
                            circleNodes.Add(node);
                        }
                    }

                    if (builder.FunctionName == FunctionNames.LineTwoPoints ||
                        builder.FunctionName == FunctionNames.Arc ||
                        builder.FunctionName == FunctionNames.Arc3P)
                    {
                        var currentSketchNode = AutoGroupLogic.FindSketchNode(node);
                        if (currentSketchNode.Index != sketchNode.Index)
                        {
                            continue;
                        }
                        var result = AutoGroupLogic.TryAutoGroup(Document, builder.Node);
                        if (result == null)
                        {
                            continue;
                        }
                        found = true;
                        results.Add(result);
                        //  var faceBuilder = new NodeBuilder(result) {Transparency = 0.5};
                        break;
                    }
                }
            }
            foreach (var node in circleNodes)
            {
                var builder    = new NodeBuilder(node);
                var addedEntiy = new SceneSelectedEntity {
                    Node = builder.Node, ShapeType = TopAbsShapeEnum.TopAbs_WIRE
                };
                var builder2 = new NodeBuilder(Document, FunctionNames.Face);
                builder2[0].ReferenceList = new List <SceneSelectedEntity> {
                    addedEntiy
                };
                builder2.ExecuteFunction();
                results.Add(builder2.Node);
            }
            return(results);
        }