public bool CheckIfPrimitiveCanSnap()
        {
            bool ModelCanSnap = false;
            if (Model.GetType() == typeof(NewSphere))
            {
                if (Model.SilhouetteCurves.Length > 0)
                    ModelCanSnap = true;
            }
            if (Model.GetType() == typeof(NewCylinder))
            {
                if (Model.SilhouetteCurves.Length > 1)
                    if (Model.SilhouetteCurves[0].AssignedTo != null && Model.SilhouetteCurves[1].AssignedTo != null)
                        ModelCanSnap = true;
            }
            if (Model.GetType() == typeof(NewCone))
            {
                if (Model.SilhouetteCurves.Length > 1)
                    if (Model.SilhouetteCurves[0].AssignedTo != null && Model.SilhouetteCurves[1].AssignedTo != null)
                        ModelCanSnap = true;
            }
            if (Model.GetType() == typeof(NewStraightGenCylinder))
            {
                if (Model.SilhouetteCurves.Length > 1)
                    if (Model.SilhouetteCurves[0].AssignedTo != null && Model.SilhouetteCurves[1].AssignedTo != null)
                        ModelCanSnap = true;
            }
            if (Model.GetType() == typeof(NewBendedGenCylinder))
            {
                if (Model.SilhouetteCurves.Length > 1 && Model.FeatureCurves.Length > 1)
                    if (Model.SilhouetteCurves[0].AssignedTo != null && Model.SilhouetteCurves[1].AssignedTo != null
                        /*&& Model.FeatureCurves[0].AssignedTo != null && Model.FeatureCurves[1].AssignedTo != null */)
                    {
                        ModelCanSnap = true;
                    }
            }
            if (Model.GetType() == typeof(NewCuboid))
            {
                NewCuboid CuboidModel = (NewCuboid)Model;
                if (CuboidModel.ActiveCubicCorner >= 0)
                {
                    int TotalMatched =
                        (from curve in CuboidModel.ArrayOfCorners[CuboidModel.ActiveCubicCorner]
                         where (curve.AssignedTo != null)
                         select curve
                        ).ToArray().Length;

                    if (TotalMatched == 3) ModelCanSnap = true;
                    /*if (CuboidModel.ActiveCubicCorner >= 0)
                        ModelCanSnap = true;*/
                }
            }

            return ModelCanSnap;
        }
示例#2
0
        public NewCuboidViewModel(UiState uiState = null, ICurveAssigner curveAssigner = null, IEventAggregator eventAggregator = null,
                                  IConstrainedOptimizer optimizer = null)
            : base(uiState, curveAssigner, eventAggregator, optimizer)
        {
            // set default data

            /*diameter = 0.2;
             * length = 0.5;
             * axis = MathUtils3D.UnitZ;*/
            model = new NewCuboid();

            /*model.Axis.Value = axis;
             * model.Length.Value = length;
             * model.Diameter.Value = diameter;*/
        }
示例#3
0
 public void Init(NewCuboid newCuboid)
 {
     Model = model = newCuboid;
     UpdateFromModel();
 }
        private void ComputeCurvesAssignment()
        {
            if (Model.IsSelected)
                Model.ClearColorCodingFromSketch();
            if (Model.GetType() != typeof(NewCuboid))
            {
                //Compute at least one silhouette curve
                curveAssigner.ComputeSilhouetteAssignments(Model);
                //Pick the first available silhouette Curve
                Model.SilhouetteCurves[0].isDeselected = true;
                if (Model.SilhouetteCurves[0].AssignedTo != null)
                    Model.SilhouetteCurves[0].AssignedTo.isdeselected = true;

                //Unassing the second silhouette curve if it exists
                if (Model.SilhouetteCurves.Length > 1 && Model.SilhouetteCurves[1].AssignedTo != null)
                    Model.SilhouetteCurves[1].AssignedTo = null;
                //Find all compatible feature curve
                while (curveAssigner.ComputeFeatureAssignments(Model))
                    Model.CheckFeatureCurves();
                var NumberOfActiveFeatureCurves = Model.FeatureCurves
                    .Select(c => c)
                    .Where(c => c.AssignedTo != null)
                    .ToArray().Length;
                if (NumberOfActiveFeatureCurves > 0)
                    while (curveAssigner.ComputeSilhouetteAssignments(Model))
                    {
                        if (NumberOfActiveFeatureCurves == 1) Model.CheckSilhoueteCurveWith1Feature();
                        else Model.CheckSilhoueteCurveWith2Features();
                    }
                var NumberOfActiveSilhouettes = Model.SilhouetteCurves
                    .Select(c => c)
                    .Where(c => c.AssignedTo != null)
                    .ToArray().Length;
                if (NumberOfActiveSilhouettes > 1)
                    if (NumberOfActiveFeatureCurves > 0)
                        Model.ValidateFeatureCurves();
            }
            else
            {
                NewCuboid cuboid = (NewCuboid)Model;
                List<Tuple<int, Point, Point>> cornerList = new List<Tuple<int, Point, Point>>();
                for (int i = 0; i < cuboid.ArrayOfCorners.Length; i++)
                {
                    while (curveAssigner.ComputeFeatureAssignments(cuboid.ArrayOfCorners[i]))
                    {
                        cuboid.CheckCubicCorner(i);

                        int numberOfAssignedFeatures = (from curve in cuboid.ArrayOfCorners[i]
                                                        where curve.AssignedTo != null
                                                        select curve).Count();
                        if (numberOfAssignedFeatures == 3)
                        {
                            Point CP = NewPrimitiveExtensions.FindCoincidentPoint(cuboid.ArrayOfCorners[i]);
                            Point CPprimitive = NewPrimitiveExtensions.FindCoincidentPoint(cuboid.ArrayOfCorners[i], false);
                            cornerList.Add(Tuple.Create(i, CP, CPprimitive));
                        }
                    }
                    curveAssigner.Refresh(Model);
                    cuboid.ArrayOfCorners[i][0].AssignedTo = null;
                    cuboid.ArrayOfCorners[i][1].AssignedTo = null;
                    cuboid.ArrayOfCorners[i][2].AssignedTo = null;
                }

                double minDistance = 10e10;
                foreach (var cubicTuple in cornerList)
                {
                    Vector v = cubicTuple.Item2 - cubicTuple.Item3;
                    if (v.Length < minDistance)
                    {
                        cuboid.ActiveCubicCorner = cubicTuple.Item1;
                        minDistance = v.Length;
                    }
                }
                if (cuboid.ActiveCubicCorner >= 0)
                while (curveAssigner.ComputeFeatureAssignments(cuboid.ArrayOfCorners[cuboid.ActiveCubicCorner]))
                {
                    cuboid.CheckCubicCorner(cuboid.ActiveCubicCorner);
                }
            }
            //Refresh all curves so that they can be selected again
            curveAssigner.Refresh(Model);
            Model.CanSnap = CheckIfPrimitiveCanSnap();

            if (Model.IsSelected)
                Model.SetColorCodingToSketch();
        }
        public NewPrimitive AddNewPrimitive(PrimitiveKinds primitiveKind, LineRange lineRange)
        {
            var pos3d = uiState.SketchPlane.PointFromRay(lineRange);

            if (pos3d != null)
            {
                undoHistory.Push();
                switch (primitiveKind)
                {
                case PrimitiveKinds.Cylinder:
                    var newCylinder = new NewCylinder();
                    newCylinder.Center.Value   = pos3d.Value;
                    newCylinder.Axis.Value     = sketchPlane.YAxis;
                    newCylinder.Diameter.Value = 0.2;
                    newCylinder.Length.Value   = 0.3;
                    sessionData.NewPrimitives.Add(newCylinder);
                    break;

                case PrimitiveKinds.Cone:
                    var newCone = new NewCone();
                    newCone.Center.Value       = pos3d.Value;
                    newCone.Axis.Value         = sketchPlane.YAxis;
                    newCone.TopRadius.Value    = 0.1;
                    newCone.BottomRadius.Value = 0.2;
                    newCone.Length.Value       = 0.3;
                    sessionData.NewPrimitives.Add(newCone);
                    break;

                case PrimitiveKinds.Sphere:
                    var newSphere = new NewSphere();
                    newSphere.Center.Value = pos3d.Value;
                    newSphere.Radius.Value = 0.2;
                    sessionData.NewPrimitives.Add(newSphere);
                    break;

                case PrimitiveKinds.SGC:
                    var newSGC = new NewStraightGenCylinder();
                    newSGC.Center.Value = pos3d.Value;
                    newSGC.Axis.Value   = sketchPlane.YAxis;
                    newSGC.Length.Value = 0.3;
                    newSGC.Components   = SgcComponents.CreateNonLinear(20, 0.075, 0.05, 0.1);
                    sessionData.NewPrimitives.Add(newSGC);
                    break;

                case PrimitiveKinds.BGC:
                    var newBGC = new NewBendedGenCylinder();
                    newBGC.Center.Value = pos3d.Value;
                    newBGC.Axis.Value   = sketchPlane.YAxis;
                    newBGC.Length.Value = 0.3;
                    newBGC.Components   = BgcComponents.Create(20, 0.075, 0.15, newBGC.Center.Value, newBGC.Axis.Value, newBGC.Length.Value);
                    sessionData.NewPrimitives.Add(newBGC);
                    break;

                case PrimitiveKinds.Cuboid:
                    var      newCuboid = new NewCuboid();
                    Vector3D H         = new Vector3D(0, 1, 0);
                    Vector3D W         = new Vector3D(1, 0, 0);
                    Vector3D D         = new Vector3D(0, 0, -1);
                    newCuboid.Center.Value = pos3d.Value;
                    newCuboid.H.Value      = H;
                    newCuboid.W.Value      = W;
                    newCuboid.D.Value      = D;
                    newCuboid.Width.Value  = 0.3;
                    newCuboid.Height.Value = 0.3;
                    newCuboid.Depth.Value  = 0.3;
                    sessionData.NewPrimitives.Add(newCuboid);
                    break;

                default:
                    Trace.Fail("Invalid primitive kind");
                    break;
                }
                sessionData.NewPrimitives.Last().UpdateCurvesGeometry();
                return(sessionData.NewPrimitives.Last());
            }
            else
            {
                return(null);
            }
        }