public override void OnSetAction() { base.TitleId = "Constr.Parametrics.DistanceTo"; FeedBack.AddSelected(frontSide); FeedBack.AddSelected(backSide); base.ActiveObject = shell.Clone(); if (shell.Layer != null) { shell.Layer.Transparency = 128; } distanceInput = new LengthInput("DistanceTo.Distance"); distanceInput.GetLengthEvent += DistanceInput_GetLengthEvent; distanceInput.SetLengthEvent += DistanceInput_SetLengthEvent; modeInput = new MultipleChoiceInput("DistanceTo.Mode", "DistanceTo.Mode.Values", 0); modeInput.SetChoiceEvent += ModeInput_SetChoiceEvent; //modeInput.GetChoiceEvent += ModeInput_GetChoiceEvent; SetInput(distanceInput, modeInput); base.OnSetAction(); FeedBack.SelectOutline = false; validResult = false; }
public override void OnSetAction() { base.TitleId = "Constr.Parametrics.DistanceTo"; if (offsetFeedBack != null) { FeedBack.AddSelected(offsetFeedBack); } if (forwardFaces != null) { FeedBack.AddSelected(forwardFaces); } base.ActiveObject = shell.Clone(); if (shell.Layer != null) { shell.Layer.Transparency = 128; } List <InputObject> actionInputs = new List <InputObject>(); distance = point1 | point2; distanceInput = new LengthInput("DistanceTo.Distance"); distanceInput.GetLengthEvent += DistanceInput_GetLengthEvent; distanceInput.SetLengthEvent += DistanceInput_SetLengthEvent; actionInputs.Add(distanceInput); forwardFacesInput = new GeoObjectInput("DistanceTo.MoreForwardObjects"); forwardFacesInput.MultipleInput = true; forwardFacesInput.FacesOnly = true; forwardFacesInput.Optional = true; forwardFacesInput.MouseOverGeoObjectsEvent += new GeoObjectInput.MouseOverGeoObjectsDelegate(OnMouseOverForwardFaces); actionInputs.Add(forwardFacesInput); backwardFacesInput = new GeoObjectInput("DistanceTo.MoreBackwardObjects"); backwardFacesInput.MultipleInput = true; backwardFacesInput.FacesOnly = true; backwardFacesInput.Optional = true; backwardFacesInput.MouseOverGeoObjectsEvent += new GeoObjectInput.MouseOverGeoObjectsDelegate(OnMouseOverBackwardFaces); actionInputs.Add(backwardFacesInput); modeInput = new MultipleChoiceInput("DistanceTo.Mode", "DistanceTo.Mode.Values", 0); modeInput.SetChoiceEvent += ModeInput_SetChoiceEvent; actionInputs.Add(modeInput); //modeInput.GetChoiceEvent += ModeInput_GetChoiceEvent; SeparatorInput separator = new SeparatorInput("DistanceTo.AssociateParametric"); actionInputs.Add(separator); nameInput = new StringInput("DistanceTo.ParametricsName"); nameInput.SetStringEvent += NameInput_SetStringEvent; nameInput.GetStringEvent += NameInput_GetStringEvent; nameInput.Optional = true; actionInputs.Add(nameInput); SetInput(actionInputs.ToArray()); base.OnSetAction(); FeedBack.SelectOutline = false; validResult = false; }
private bool Refresh() { validResult = false; if (facesToMove.Count > 0 && (facesToKeep.Count > 0 || axisToMove != null)) { FeedBack.ClearSelected(); GeoPoint startPoint = offsetStartPoint; GeoPoint endPoint = startPoint + originalOffset + currentOffset; switch (mode) { case Mode.forward: startPoint = offsetStartPoint; endPoint = startPoint + originalOffset + currentOffset; offsetFeedBack = Frame.ActiveView.Projection.MakeArrow(startPoint, endPoint, feedbackPlane, Projection.ArrowMode.circleArrow); break; case Mode.backward: startPoint = offsetStartPoint + originalOffset; endPoint = startPoint - originalOffset - currentOffset; offsetFeedBack = Frame.ActiveView.Projection.MakeArrow(startPoint, endPoint, feedbackPlane, Projection.ArrowMode.circleArrow); break; case Mode.symmetric: startPoint = offsetStartPoint + 0.5 * originalOffset; offsetFeedBack = Frame.ActiveView.Projection.MakeArrow(startPoint, startPoint + 0.5 * (originalOffset + currentOffset), feedbackPlane, Projection.ArrowMode.circleArrow); offsetFeedBack.AddRange(Frame.ActiveView.Projection.MakeArrow(startPoint, startPoint - 0.5 * (originalOffset + currentOffset), feedbackPlane, Projection.ArrowMode.circleArrow)); break; } offsetFeedBack.AddRange(facesToMove); offsetFeedBack.AddRange(moreForwardFaces); FeedBack.AddSelected(offsetFeedBack); Shell sh = null; for (int m = 0; m <= 1; m++) { // first try without moving connected faces, if this yields no result, try with moving connected faced Parametric parametric = new Parametric(shell); Dictionary <Face, GeoVector> allFacesToMove = new Dictionary <Face, GeoVector>(); switch (mode) { case Mode.forward: foreach (Face face in Extensions.Combine(facesToMove, moreForwardFaces)) { allFacesToMove[face] = currentOffset; } foreach (Face face in Extensions.Combine(facesToKeep, moreBackwardFaces)) { allFacesToMove[face] = GeoVector.NullVector; } break; case Mode.symmetric: foreach (Face face in Extensions.Combine(facesToMove, moreForwardFaces)) { allFacesToMove[face] = 0.5 * currentOffset; } foreach (Face face in Extensions.Combine(facesToKeep, moreBackwardFaces)) { allFacesToMove[face] = -0.5 * currentOffset; } break; case Mode.backward: foreach (Face face in Extensions.Combine(facesToKeep, moreBackwardFaces)) { allFacesToMove[face] = -currentOffset; } foreach (Face face in Extensions.Combine(facesToMove, moreForwardFaces)) { allFacesToMove[face] = GeoVector.NullVector; } break; } parametric.MoveFaces(allFacesToMove, currentOffset, m == 1); if (parametric.Apply()) { sh = parametric.Result(); if (sh != null) { ParametricDistanceProperty.Mode pmode = 0; if (m == 1) { pmode |= ParametricDistanceProperty.Mode.connected; } if (mode == Mode.symmetric) { pmode |= ParametricDistanceProperty.Mode.symmetric; } // create the ParametricDistanceProperty here, because here we have all the information parametric.GetDictionaries(out Dictionary <Face, Face> faceDict, out Dictionary <Edge, Edge> edgeDict, out Dictionary <Vertex, Vertex> vertexDict); // facesToKeep etc. contains original objects of the shell, affectedObjects contains objects of the sh = pm.Result() // the parametricProperty will be applied to sh, so we need the objects from sh object fromHere = null, toHere = null; if (distanceFromHere is Face fromFace) { fromHere = faceDict[fromFace]; } if (distanceFromHere is Edge fromEdge) { fromHere = edgeDict[fromEdge]; } if (distanceFromHere is Vertex fromVertex) { fromHere = vertexDict[fromVertex]; } if (distanceToHere is Face toFace) { toHere = faceDict[toFace]; } if (distanceToHere is Edge toEdge) { toHere = edgeDict[toEdge]; } if (distanceToHere is Vertex toVertex) { toHere = vertexDict[toVertex]; } if (mode == Mode.backward) { parametricProperty = new ParametricDistanceProperty("", Extensions.LookUp(Extensions.Combine(facesToMove, moreForwardFaces), faceDict), Extensions.LookUp(Extensions.Combine(facesToKeep, moreBackwardFaces), faceDict), parametric.GetAffectedObjects(), pmode, toHere, fromHere); } else { parametricProperty = new ParametricDistanceProperty("", Extensions.LookUp(Extensions.Combine(facesToKeep, moreBackwardFaces), faceDict), Extensions.LookUp(Extensions.Combine(facesToMove, moreForwardFaces), faceDict), parametric.GetAffectedObjects(), pmode, fromHere, toHere); } break; } } } if (sh != null) { ActiveObject = sh; validResult = true; return(true); } else { ActiveObject = shell.Clone(); return(false); } } return(false); }
private bool Refresh() { validResult = false; if (forwardFaces.Count > 0 && backwardFaces.Count > 0) { FeedBack.ClearSelected(); GeoPoint startPoint = point1; GeoPoint endPoint = point2; GeoVector dir = (point2 - point1).Normalized; double originalDistance = point2 | point1; switch (mode) { case Mode.forward: endPoint = point2 + (distance - originalDistance) * dir; offsetFeedBack = Frame.ActiveView.Projection.MakeArrow(startPoint, endPoint, feedbackPlane, Projection.ArrowMode.circleArrow); break; case Mode.backward: startPoint = point1 - (distance - originalDistance) * dir; offsetFeedBack = Frame.ActiveView.Projection.MakeArrow(endPoint, startPoint, feedbackPlane, Projection.ArrowMode.circleArrow); break; case Mode.symmetric: startPoint = point1 - 0.5 * (distance - originalDistance) * dir; endPoint = point2 + 0.5 * (distance - originalDistance) * dir; GeoPoint mp = new GeoPoint(startPoint, endPoint); offsetFeedBack = Frame.ActiveView.Projection.MakeArrow(mp, startPoint, feedbackPlane, Projection.ArrowMode.circleArrow); offsetFeedBack.AddRange(Frame.ActiveView.Projection.MakeArrow(mp, endPoint, feedbackPlane, Projection.ArrowMode.circleArrow)); break; } offsetFeedBack.AddRange(forwardFaces); offsetFeedBack.AddRange(backwardFaces); FeedBack.AddSelected(offsetFeedBack); Shell sh = null; for (int m = 0; m <= 1; m++) { // first try without moving connected faces, if this yields no result, try with moving connected faced Parametric parametric = new Parametric(shell); Dictionary <Face, GeoVector> allFacesToMove = new Dictionary <Face, GeoVector>(); GeoVector offset = (distance - originalDistance) * dir; switch (mode) { case Mode.forward: foreach (Face face in forwardFaces) { allFacesToMove[face] = offset; } foreach (Face face in backwardFaces) { allFacesToMove[face] = GeoVector.NullVector; } break; case Mode.symmetric: foreach (Face face in forwardFaces) { allFacesToMove[face] = 0.5 * offset; } foreach (Face face in backwardFaces) { allFacesToMove[face] = -0.5 * offset; } break; case Mode.backward: foreach (Face face in backwardFaces) { allFacesToMove[face] = -offset; } foreach (Face face in forwardFaces) { allFacesToMove[face] = GeoVector.NullVector; } break; } parametric.MoveFaces(allFacesToMove, offset, m == 1); if (parametric.Apply()) { sh = parametric.Result(); if (sh != null) { ParametricDistanceProperty.Mode pmode = 0; if (m == 1) { pmode |= ParametricDistanceProperty.Mode.connected; } if (mode == Mode.symmetric) { pmode |= ParametricDistanceProperty.Mode.symmetric; } // create the ParametricDistanceProperty here, because here we have all the information parametric.GetDictionaries(out Dictionary <Face, Face> faceDict, out Dictionary <Edge, Edge> edgeDict, out Dictionary <Vertex, Vertex> vertexDict); // facesToKeep etc. contains original objects of the shell, affectedObjects contains objects of the sh = pm.Result() // the parametricProperty will be applied to sh, so we need the objects from sh if (mode == Mode.backward) { parametricProperty = new ParametricDistanceProperty("", Extensions.LookUp(forwardFaces, faceDict), Extensions.LookUp(backwardFaces, faceDict), parametric.GetAffectedObjects(), pmode, point2, point1); } else { parametricProperty = new ParametricDistanceProperty("", Extensions.LookUp(backwardFaces, faceDict), Extensions.LookUp(forwardFaces, faceDict), parametric.GetAffectedObjects(), pmode, point1, point2); } break; } } } if (sh != null) { ActiveObject = sh; validResult = true; return(true); } else { ActiveObject = shell.Clone(); return(false); } } return(false); }