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; }
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;*/ }
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); } }