public void generateModel() { //TODO-simplify the curve and pass to model function simplifyCurve(ref ((Geometry.GeometryStroke)(stroke_g)).mPoints); //result curve is simplifiedCurve if (dynamicRender == "none" || simplifiedCurve == null) { return; } else if (dynamicRender == "Revolve") { if (mScene.iCurveList.Count == 0) { if (drawnType != DrawnType.In3D && curveOnObjRef != null) { simplifiedCurve.SetUserString(CurveData.CurveOnObj.ToString(), curveOnObjRef.ObjectId.ToString()); simplifiedCurve.SetUserString(CurveData.PlaneOrigin.ToString(), curvePlane.Origin.ToString()); simplifiedCurve.SetUserString(CurveData.PlaneNormal.ToString(), curvePlane.Normal.ToString()); } mScene.iCurveList.Add(simplifiedCurve); } else { //get the curve info for later update use oldCurveOnObjID = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.CurveOnObj.ToString()); oldPlaneOrigin = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.PlaneOrigin.ToString()); oldPlaneNormal = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.PlaneNormal.ToString()); simplifiedCurve.SetUserString(CurveData.CurveOnObj.ToString(), oldCurveOnObjID); simplifiedCurve.SetUserString(CurveData.PlaneOrigin.ToString(), oldPlaneOrigin); simplifiedCurve.SetUserString(CurveData.PlaneNormal.ToString(), oldPlaneNormal); mScene.iCurveList[0] = simplifiedCurve; } dynamicBrep = UtilOld.RevolveFunc(ref mScene, ref mScene.iCurveList); } //TODO- fix the bug that when release, it accidently assign the old plane id to the curve. else if (dynamicRender == "Loft") { if (mScene.iCurveList.Count == 1) { if (drawnType != DrawnType.In3D && curveOnObjRef != null) { simplifiedCurve.SetUserString(CurveData.CurveOnObj.ToString(), curveOnObjRef.ObjectId.ToString()); simplifiedCurve.SetUserString(CurveData.PlaneOrigin.ToString(), curvePlane.Origin.ToString()); simplifiedCurve.SetUserString(CurveData.PlaneNormal.ToString(), curvePlane.Normal.ToString()); } mScene.iCurveList.Add(simplifiedCurve); } else { oldCurveOnObjID = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.CurveOnObj.ToString()); oldPlaneOrigin = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.PlaneOrigin.ToString()); oldPlaneNormal = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.PlaneNormal.ToString()); simplifiedCurve.SetUserString(CurveData.CurveOnObj.ToString(), oldCurveOnObjID); simplifiedCurve.SetUserString(CurveData.PlaneOrigin.ToString(), oldPlaneOrigin); simplifiedCurve.SetUserString(CurveData.PlaneNormal.ToString(), oldPlaneNormal); mScene.iCurveList[1] = simplifiedCurve; } dynamicBrep = UtilOld.LoftFunc(ref mScene, ref mScene.iCurveList); } else if (dynamicRender == "Extrude") { //Rhino.Geometry.Vector3d heightVector = simplifiedCurve.PointAtEnd - simplifiedCurve.PointAtStart; Rhino.Geometry.Vector3d heightVector = simplifiedCurve.PointAtEnd - snapPointsList[0]; Rhino.Geometry.Vector3d planeNormal = UtilOld.getVectorfromString(localListCurve[0].GetUserString(CurveData.PlaneNormal.ToString())); planeNormal.Unitize(); double height = Rhino.Geometry.Vector3d.Multiply(heightVector, planeNormal) / planeNormal.Length; List <Point3d> extrudeCurveP = new List <Point3d>(); Point3d startP = snapPointsList[0]; extrudeCurveP.Add(startP); Point3d endP = new Point3d(startP.X + height * planeNormal.X, startP.Y + height * planeNormal.Y, startP.Z + height * planeNormal.Z); extrudeCurveP.Add(endP); //update the edit curve editCurve = Rhino.Geometry.NurbsCurve.Create(false, 1, extrudeCurveP.ToArray()); if (localListCurve.Count == 1) { if (drawnType != DrawnType.In3D && curveOnObjRef != null) { editCurve.SetUserString(CurveData.CurveOnObj.ToString(), curveOnObjRef.ObjectId.ToString()); editCurve.SetUserString(CurveData.PlaneOrigin.ToString(), curvePlane.Origin.ToString()); editCurve.SetUserString(CurveData.PlaneNormal.ToString(), curvePlane.Normal.ToString()); } localListCurve.Add(editCurve); } else { oldCurveOnObjID = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.CurveOnObj.ToString()); oldPlaneOrigin = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.PlaneOrigin.ToString()); oldPlaneNormal = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.PlaneNormal.ToString()); editCurve.SetUserString(CurveData.CurveOnObj.ToString(), oldCurveOnObjID); editCurve.SetUserString(CurveData.PlaneOrigin.ToString(), oldPlaneOrigin); editCurve.SetUserString(CurveData.PlaneNormal.ToString(), oldPlaneNormal); localListCurve[1] = editCurve; } dynamicBrep = UtilOld.ExtrudeFunc(ref mScene, ref localListCurve); } else if (dynamicRender == "Sweep") { if (localListCurve.Count == 1) { if (drawnType != DrawnType.In3D && curveOnObjRef != null) { simplifiedCurve.SetUserString(CurveData.CurveOnObj.ToString(), curveOnObjRef.ObjectId.ToString()); simplifiedCurve.SetUserString(CurveData.PlaneOrigin.ToString(), curvePlane.Origin.ToString()); simplifiedCurve.SetUserString(CurveData.PlaneNormal.ToString(), curvePlane.Normal.ToString()); } localListCurve.Add(simplifiedCurve); } else { oldCurveOnObjID = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.CurveOnObj.ToString()); oldPlaneOrigin = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.PlaneOrigin.ToString()); oldPlaneNormal = mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.PlaneNormal.ToString()); simplifiedCurve.SetUserString(CurveData.CurveOnObj.ToString(), oldCurveOnObjID); simplifiedCurve.SetUserString(CurveData.PlaneOrigin.ToString(), oldPlaneOrigin); simplifiedCurve.SetUserString(CurveData.PlaneNormal.ToString(), oldPlaneNormal); localListCurve[1] = simplifiedCurve; } dynamicBrep = UtilOld.SweepFun(ref mScene, ref localListCurve); } /* * mScene.iCurveList.Clear(); * //mScene.iCurveList = localListCurve; * foreach (Curve c in localListCurve) * { * mScene.iCurveList.Add(c); * } */ }
public override void init() { resetVariables(); //support undo function if (mScene != null && (afterCurveCount - beforeCurveCount) > 0) { if (mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.CurveOnObj.ToString()) != "") { Guid curveOnObjId = new Guid(mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.CurveOnObj.ToString())); ObjRef curveOnObjRef = new ObjRef(curveOnObjId); if (curveOnObjRef.Object().Attributes.Name.Contains("railPlane") || curveOnObjRef.Object().Attributes.Name.Contains("MoveP")) { UtilOld.removeRhinoObject(ref mScene, curveOnObjRef.ObjectId); } } mScene.iCurveList.RemoveAt(mScene.iCurveList.Count - 1); UtilOld.removeSceneNode(ref mScene, ref strokeSN); strokeSN = null; //need to clear stroke tprint SceneNode as well here if (renderObjSN != null) { UtilOld.removeSceneNode(ref mScene, ref renderObjSN); renderObjSN = null; } //Util.removeRhinoObject(ref mScene, curveOnObjRef.ObjectId); curveOnObjRef = null; if (railPlaneSN != null) { UtilOld.removeRhinoObjectSceneNode(ref mScene, ref railPlaneSN); railPlaneSN = null; } } if (drawnType != DrawnType.In3D && drawnType != DrawnType.None) { UtilOld.showLaser(ref mScene, true); //create and add referece planes to scene if (drawnType == DrawnType.Reference) { Vector3 railPlaneNormal = UtilOld.RhinoToOpenTKVector(UtilOld.getVectorfromString(mScene.iCurveList[mScene.iCurveList.Count - 1].GetUserString(CurveData.PlaneNormal.ToString()))); OpenTK.Vector3 worldUpAxis = new Vector3(0, 0, 1); //trick to avoid cross product of 2 parallel vetors if (railPlaneNormal.X == 0 && railPlaneNormal.Y == 0 && railPlaneNormal.Z == 1) { railPlaneNormal = new Vector3(0, 0.005f, 1); } Plane railPlane = new Plane(mScene.iCurveList[mScene.iCurveList.Count - 1].GetBoundingBox(true).Center, UtilOld.openTkToRhinoVector(Vector3.Cross(railPlaneNormal, worldUpAxis))); float planeSize = 240; PlaneSurface plane_surface2 = new PlaneSurface(railPlane, new Interval(-planeSize, planeSize), new Interval(-planeSize, planeSize)); Brep railPlane2 = Brep.CreateFromSurface(plane_surface2); Guid railPlaneGuid = UtilOld.addRhinoObjectSceneNode(ref mScene, ref railPlane2, ref railPlane_m, "railPlane", out railPlaneSN); } else if (drawnType == DrawnType.Plane) { UtilOld.setPlaneAlpha(ref mScene, 0.4f); } //init rayCastingObjs Rhino.DocObjects.ObjectEnumeratorSettings settings = new Rhino.DocObjects.ObjectEnumeratorSettings(); settings.ObjectTypeFilter = Rhino.DocObjects.ObjectType.Brep; foreach (Rhino.DocObjects.RhinoObject rhObj in mScene.rhinoDoc.Objects.GetObjectList(settings)) { bool b1 = (drawnType == DrawnType.Plane) && rhObj.Attributes.Name.Contains("plane"); bool b2 = (drawnType == DrawnType.Surface) && (rhObj.Attributes.Name.Contains("brepMesh") || rhObj.Attributes.Name.Contains("aprint") || rhObj.Attributes.Name.Contains("patchSurface")); bool b3 = (drawnType == DrawnType.Reference) && rhObj.Attributes.Name.Contains("railPlane"); if (b1 || b2 || b3) { rayCastingObjs.Add(new ObjRef(rhObj.Id)); } } Geometry.Geometry geo = new Geometry.DrawPointMarker(new OpenTK.Vector3(0, 0, 0)); Material.Material m = new Material.SingleColorMaterial(1, 1, 1, 0);//TODO: teseting alpha working or not drawPoint = new SceneNode("drawPoint", ref geo, ref m); UtilOld.addSceneNode(ref mScene, ref drawPoint); } else { UtilOld.showLaser(ref mScene, false); } //generate snap points when we need to draw from the center of the shapes, drawnType could be DrawnType.Reference or DrawnType.In3D if (dynamicRender == "Extrude" || dynamicRender == "Sweep" || drawnType == DrawnType.Reference) { shouldSnap = true; ShapeType shapeType = (ShapeType)mScene.selectionDic[SelectionKey.Profile1Shape]; Circle circle; Rectangle3d rect; if (shapeType == ShapeType.Circle) { if (mScene.iCurveList[mScene.iCurveList.Count - 1].TryGetCircle(out circle)) { snapPointsList.Add(circle.Center); } } else if (shapeType == ShapeType.Rect) { Rhino.Geometry.Polyline polyline; if (mScene.iCurveList[mScene.iCurveList.Count - 1].TryGetPolyline(out polyline)) { rect = Rectangle3d.CreateFromPolyline(polyline); snapPointsList.Add(rect.Center); } } //visualize the snap points Geometry.Geometry geo = new Geometry.DrawPointMarker(new Vector3(0, 0, 0)); Material.Material m = new Material.SingleColorMaterial(0, 1, 0, 1); UtilOld.MarkPointVR(ref mScene, UtilOld.platformToVRPoint(ref mScene, UtilOld.RhinoToOpenTKPoint(snapPointsList[0])), ref geo, ref m, out snapPointSN); } d = new generateModel_Delegate(generateModel); }