private void SetLength(object data)
        {
            if (Builder[0].ReferenceBuilder.FunctionName == FunctionNames.Circle)
            {
                BeginUpdate();
                var nb = new NodeBuilder(Builder[0].ReferenceBuilder.Node);
                nb[1].Real = (double)data / 2;
                nb.ExecuteFunction();
                EndVisualUpdate("Updated radius");
            }
            if (Builder[0].ReferenceBuilder.FunctionName != FunctionNames.LineTwoPoints)
            {
                return;
            }
            BeginUpdate();
            TreeUtils.SetLineLength(Builder[0].ReferenceBuilder.Node, (double)data);
            var document   = _viewInfo.Document;
            var constraint = NodeBuilderUtils.ShapeHasConstraint(Builder[0].ReferenceBuilder.Node, Constraint2DNames.LineLengthFunction, document);

            if (constraint != -1)
            {
                var nb = new NodeBuilder(document.Root[constraint]);
                nb.Dependency[2].Real = (double)data;
                nb.ExecuteFunction();
            }
            CallSolverForLineChanges(Builder[0].ReferenceBuilder.Node);
            EndVisualUpdate("Updated Length");
        }
        protected void UpdateLineLock()
        {
            BeginUpdate();

            var constraint = NodeBuilderUtils.ShapeHasConstraint(Parent, Constraint2DNames.LineLengthFunction, _viewInfo.Document);

            if (constraint != -1)
            {
                _viewInfo.Document.Root.Remove(constraint);
                // remove dimension
                var dimensionNodeIndex = 0;
                foreach (var child in _viewInfo.Document.Root.Children)
                {
                    if (child.Value.Get <FunctionInterpreter>().Name == FunctionNames.Dimension)
                    {
                        if (child.Value.Children[1].Get <ReferenceInterpreter>().Node.Index == Parent.Index)
                        {
                            dimensionNodeIndex = child.Value.Index;
                            break;
                        }
                    }
                }
                if (dimensionNodeIndex != 0)
                {
                    _viewInfo.Document.Root.Remove(dimensionNodeIndex);
                }
            }
            else
            {
                NodeBuilderUtils.AddLengthAndDimensionConstraint(_viewInfo.Document, Parent, true);
            }
            EndVisualUpdate("Update constraint");
        }
        protected void UpdateLock(bool islocked, string functionName, double value)
        {
            BeginUpdate();
            var constraint = NodeBuilderUtils.ShapeHasConstraint(Parent, functionName, _viewInfo.Document);

            if (constraint != -1)
            {
                _viewInfo.Document.Root.Remove(constraint);
            }
            else
            {
                AddConstraintToOneField(functionName, value);
            }
            EndVisualUpdate("Update constraint");
        }
        protected void UpdateCircleLock()
        {
            BeginUpdate();

            var constraint = NodeBuilderUtils.ShapeHasConstraint(Parent, Constraint2DNames.CircleRadiusFunction, _viewInfo.Document);

            if (constraint != -1)
            {
                _viewInfo.Document.Root.Remove(constraint);
            }
            else
            {
                NodeBuilderUtils.AddRadiusConstraint(_viewInfo.Document, Parent);//, value);
            }
            EndVisualUpdate("Update constraint");
        }
示例#5
0
        public override void UpdatePointPosition(int index, Mouse3DPosition vertex)
        {
            var radiusConstraint = NodeBuilderUtils.ShapeHasConstraint(Node, Constraint2DNames.CircleRadiusFunction,
                                                                       Dependency[0].Node.Root.Get
                                                                       <DocumentContextInterpreter>().Document);

            // allow edits only if we don't have a radius constraint
            if (radiusConstraint == -1)
            {
                var transform = Node.Get <TransformationInterpreter>();
                switch (index)
                {
                case 0:
                case 1:
                case 2:
                case 3:
                    // The radius is the distance between the center and the new point
                    var dependency = TreeUtils.GetFunctionDependency(Node);
                    if (Dependency[0].Name == FunctionNames.Point || Dependency[0].Name == InterpreterNames.Reference)
                    {
                        dependency[1].Real =
                            vertex.Point.GpPnt.Distance(
                                Dependency[0].RefTransformedPoint3D.GpPnt.Transformed(transform.CurrTransform));
                    }
                    if (Dependency[0].Name == FunctionNames.AxisHandle)
                    {
                        dependency[1].Real =
                            vertex.Point.GpPnt.Distance(
                                Dependency[0].TransformedAxis3D.Location.Transformed(transform.CurrTransform));
                    }
                    break;
                }
                if (Dependency[0].Name == FunctionNames.Point || Dependency[0].Name == InterpreterNames.Reference)
                {
                    var document         = Dependency[0].Node.Root.Get <DocumentContextInterpreter>().Document;
                    var sketchNode       = Dependency[0].ReferenceBuilder[0].ReferenceBuilder[0].Node;
                    var constraintMapper =
                        new ConstraintDocumentHelper(document,
                                                     sketchNode);
                    constraintMapper.SetMousePosition(Dependency[0].Reference.Index);
                    var error = constraintMapper.ImpactAndSolve(Dependency[0].Node.Parent);
                }
            }
        }