public static ITFFrameList createFrameCN (PenetrTask task, PenetrInfo penInfo) { task.scanInfo(); // TODO отключено временно, до решения по алгоритму пересечений фланцев: //if (!Keyins.Penetrations.DEBUG_MODE) { // if (task.isCompoundExistsInPlace || task.TFFormsIntersected.Count == 0) // return null; //} var taskUOR = task.UOR; double pipeInsideDiam = penInfo.pipeDiameterInside * taskUOR.active_perSub; double pipeOutsideDiam = penInfo.pipeDiameterOutside * taskUOR.active_perSub; double flangeInsideDiam = penInfo.flangeDiameterInside * taskUOR.active_perSub; double flangeOutsideDiam = penInfo.flangeDiameterOutside * taskUOR.active_perSub; double flangeThick = penInfo.flangeThick * taskUOR.active_perSub; double length = task.Length * taskUOR.active_perSub; double pipeInRadius = pipeInsideDiam / 2; double pipeOutRadius = pipeOutsideDiam / 2; var tfApi = new Bentley.Building.Api.TFApplicationList().AsTFApplication; BCOM.ModelReference activeModel = App.ActiveModelReference; //ITFBrepList brepList; //tfApi.CreateTFBrep(0, out brepList); DPoint3d origin = task.Location.ToDPoint(); origin.ScaleInPlace(taskUOR.active_perMaster); DMatrix3d rot = task.Rotation.ToDMatrix3d(); var dTran = DTransform3d.FromMatrixAndTranslation(rot, origin); var tranInfo = new TransformInfo(dTran); // DMatrix3d.FromColumns( //rot.RowX.ToDVector(), rot.RowX.ToDVector(), rot.RowX.ToDVector()); //ITFFormRecipeList recipeList; var model = Session.Instance.GetActiveDgnModel(); var modelRef = Session.Instance.GetActiveDgnModelRef(); //CellHeaderElement taskEl = Element.GetFromElementRef(task.elemRefP) as CellHeaderElement; //DPoint3d taskOrigin; //taskEl.GetSnapOrigin(out taskOrigin); var ellips = new EllipseElement(model, null, DEllipse3d.FromCenterRadiusNormal(DPoint3d.Zero, pipeOutRadius, DVector3d.FromXY(0, 1))); ellips.ApplyTransform(tranInfo); var cone = new ConeElement(model, null, pipeOutRadius, pipeOutRadius, DPoint3d.FromXYZ(0, length, 0), DPoint3d.Zero, DMatrix3d.Rotation(DVector3d.UnitX, Angle.FromDegrees(-90)), true); cone.ApplyTransform(tranInfo); var ellips2 = new EllipseElement(model, null, DEllipse3d.FromCenterRadiusNormal( DPoint3d.Zero, pipeInRadius, DVector3d.FromXY(0, 1))); ellips2.ApplyTransform(tranInfo); var cone2 = new ConeElement(model, null, pipeInRadius, pipeInRadius, DPoint3d.Zero, DPoint3d.FromXYZ(0, length, 0), DMatrix3d.Zero, false); cone2.ApplyTransform(tranInfo); //int status = brepList.InitCylinder(pipeInsideRadius*task_subPerMaster, // (length - flangeThick)*task_subPerMaster, ref origin, // ref matrix, ""); //ITFElementList elemList; //tfApi.CreateTFElement(0, out elemList); // Bentley.GeometryNET.Common.CircularCylinder //ITFBrepList coneBrepList, cone2BrepList, resBrepList; //tfApi.CreateTFBrep(0, out coneBrepList); //tfApi.CreateTFBrep(0, out cone2BrepList); //coneBrepList.InitFromElement(cone, modelRef, ""); //cone2BrepList.InitFromElement(cone2, modelRef, ""); //coneBrepList.AsTFBrep.InitCylinder(pipeInsideRadius, length, ref origin, // ref matrix, 0); ITFItemList itemList; tfApi.CreateTFItem(0, out itemList); //var sweepDir = DVector3d.FromXY(1, 0); //coneBrepList.AsTFBrep.Drop(out resBrepList, cone2BrepList, 0); //sweepDir.NegateInPlace(); // coneBrepList.AsTFBrep.Cut(out resBrepList, cone2BrepList, ref sweepDir, length + 150, false, 0); //coneBrepList.AsTFBrep.SweepByVector3(ref sweepDir, length + 300, // pipeOutsideRadius - pipeInsideRadius, 0, 0); //Array arr = new System.Collections.ArrayList().ToArray(); //coneBrepList.AsTFBrep.Cut2(out resBrepList, cone2BrepList.AsTFBrep, ref sweepDir, //Bentley.Building.Api.TFdBrepCutMethod.tfdBrepCutMethod_Outside, //Bentley.Building.Api.TFdBrepCutDirection.tfdBrepCutDirection_Both, //Bentley.Building.Api.TFdBrepCutDepth.tfdBrepCutDepth_UpToSolid, length, //arr, 0, false, Bentley.Building.Api.TFdBrepCutDepth.tfdBrepCutDepth_UpToSolid, length, //arr, 0, false, 0, 0, 0.00005, 0); //lement resElement; //resBrepList.GetElement(out resElement, 0, ""); //coneBrepList.GetElement(out resElement, 0, ""); ITFFrameList frameList; tfApi.CreateTFFrame(0, out frameList); frameList.AsTFFrame.Add3DElement(cone, 0); //frameList.AsTFFrame.Add3DElement(cone2, 0); //frameList.AsTFFrame.Add3DElement(resElement, 0); //ITFFrameList openingFrameList; //tfApi.CreateTFFrame(0, out openingFrameList); //openingFrameList.AsTFFrame.Add3DElement(cone2, 0); //ITFFormRecipeList openRecipeList; ////tfApi.CreateTFFormRecipeArc //ITFFormRecipe openRecipe; //openingFrameList.AsTFFrame.GetFormRecipeList(0, out openRecipeList); //openRecipe = openRecipeList.AsTFFormRecipe; //ITFItemList featureList; //frameList.AsTFFrame.AddOpeningsToForm(out featureList, ref openRecipe, "", 0); ITFPerforatorList perfoList; tfApi.CreateTFPerforator(0, out perfoList); var dir = DVector3d.FromXY(1, 0); var tran = DTransform3d.Identity; perfoList.InitFromElement(ellips, ref dir, length, ref tran, ""); perfoList.AsTFPerforator.SetIsVisible(false, 0); perfoList.SetSweepMode(Bentley.Building.Api.TFdPerforatorSweepMode.tfdPerforatorSweepModeBi, ""); perfoList.SetPolicy(Bentley.Building.Api.TFdPerforatorPolicy.tfdPerforatorPolicyThroughHoleWithinSenseDist, ""); frameList.AsTFFrame.SetPerforatorList(ref perfoList, 0); frameList.AsTFFrame.SetSenseDistance2(length / 100, 0); frameList.AsTFFrame.SetPerforatorsAreActive(true, 0); int stat; // = tfApi.ModelReferenceAddFrameList(modelRef, ref frameList, 0); var frame = frameList.AsTFFrame; stat = tfApi.ModelReferenceUpdateAutoOpeningsByFrame(modelRef, ref frame, true, false, Bentley.Building.Api.TFdFramePerforationPolicy.tfdFramePerforationPolicyNone, 0); //Element cylindr; //brepList.GetElement(out cylindr, 0, ""); //cylindr.AddToModel(); //Element tfElement; //Element perfo = null; //Element dp_2d = null; //int value; //tfApi.ModelReferenceAddElement(ref cylindr, Session.Instance.GetActiveDgnModel(), // 0, 0, out value); //tfApi.ModelReferenceConstructFrameElement(Session.Instance.GetActiveDgnModel(), // 0, ref cylindr, ref perfo, ref origin, ref dp_2d, "name", null, // 1, 0, false, null, false, task.Length, 0.00005, 0, out tfElement); //frameList.InitFromElement(cylindr, ""); // frameList.AsTFFrame.Add3DElement(cylindr, 0); return(frameList); }
protected override void OnDynamicFrame(Bentley.DgnPlatformNET.DgnButtonEvent ev) { try { if (PolyhedraCE.StaticElement == null) { if (!string.IsNullOrEmpty(PolyhedronName)) { if (PolyhedraCE.ListOfPolyhedra.ContainsKey(PolyhedronName)) { BPSUtilities.WriteLog($"Found cell for '{PolyhedronName}'"); PolyhedraCE.StaticElement = PolyhedraCE.ListOfPolyhedra[PolyhedronName]; } else { m_haveFirstPoint = false; BPSUtilities.WriteLog($"Cell for '{PolyhedronName}' not found."); this.EndDynamics(); } } else { BPSUtilities.WriteLog("Polyhedron Name not set."); m_haveFirstPoint = false; this.EndDynamics(); } } try { Bentley.DgnPlatformNET.Elements.CellHeaderElement cellElem = (Bentley.DgnPlatformNET.Elements.CellHeaderElement)(PolyhedraCE.StaticElement); if (cellElem.CellName != PolyhedronName) { BPSUtilities.WriteLog($"Current cell is {cellElem.CellName}"); if (!string.IsNullOrEmpty(PolyhedronName)) { if (PolyhedraCE.ListOfPolyhedra.ContainsKey(PolyhedronName)) { BPSUtilities.WriteLog($"Found cell for '{PolyhedronName}'"); if (PolyhedraCE.StaticElement != null) { PolyhedraCE.StaticElement.Dispose(); } PolyhedraCE.StaticElement = PolyhedraCE.ListOfPolyhedra[PolyhedronName]; } else { m_haveFirstPoint = false; BPSUtilities.WriteLog($"Cell for '{PolyhedronName}' not found."); this.EndDynamics(); } } else { BPSUtilities.WriteLog("Polyhedron Name not set."); m_haveFirstPoint = false; this.EndDynamics(); } } } catch (Exception ex) { BPSUtilities.WriteLog($"Error casting cell {ex.Message}"); } if (PolyhedraCE.StaticElement != null) { RedrawElems redrawElems = new RedrawElems(); redrawElems.SetDynamicsViewsFromActiveViewSet(Bentley.MstnPlatformNET.Session.GetActiveViewport()); redrawElems.DrawMode = DgnDrawMode.TempDraw; redrawElems.DrawPurpose = DrawPurpose.Dynamics; try { DMatrix3d invertedViewportRotation = new DMatrix3d(1, 0, 0, 0, 1, 0, 0, 0, 1); // Identity if (ev.Viewport.GetRotation().TryInvert(out invertedViewportRotation)) { DMatrix3d cellRotation = new DMatrix3d(1, 0, 0, 0, 1, 0, 0, 0, 1); // Identity List <Bentley.DgnPlatformNET.Elements.Element> listChildElements = new List <Bentley.DgnPlatformNET.Elements.Element>(); foreach (Bentley.DgnPlatformNET.Elements.Element child in PolyhedraCE.StaticElement.GetChildren()) { listChildElements.Add(child); } Bentley.DgnPlatformNET.Elements.CellHeaderElement copiedElement = new CellHeaderElement(Session.Instance.GetActiveDgnModel(), PolyhedronName, new DPoint3d(0, 0, 0), cellRotation, listChildElements); if (copiedElement != null) { if (copiedElement.IsValid) { if (!m_haveFirstPoint) { DPoint3d translation = ev.Point; DMatrix3d viewMatrix = ev.Viewport.GetRotation(); DPoint3d[] blkPts = new DPoint3d[4]; DPoint3d low = DPoint3d.Zero, high = DPoint3d.Zero; ev.Viewport.GetViewCorners(out low, out high); // rotate points to orthogonal blkPts[0] = new DPoint3d(viewMatrix.Multiply(new DVector3d(low))); blkPts[2] = new DPoint3d(viewMatrix.Multiply(new DVector3d(high))); blkPts[2].Z = blkPts[0].Z; DPoint3d ext = DPoint3d.Subtract(blkPts[2], blkPts[0]); double dScale = Math.Max(0.15 * Math.Abs(ext.Magnitude / uorPerMaster()), 1.0); DPoint3d dPtScale = ev.Viewport.GetScale(); // dScale = dPtScale.Magnitude; // BPSUtilities.WriteLog($"Scale: {dScale}, View: {ev.ViewNumber}"); invertedViewportRotation.ScaleInPlace(dScale); // works DTransform3d translateAndRotateToUpInViewWithViewBasedScale = DTransform3d.FromMatrixAndTranslation(invertedViewportRotation, translation); TransformInfo transformInfo = new TransformInfo(translateAndRotateToUpInViewWithViewBasedScale); // works copiedElement.ApplyTransform(transformInfo); } else { // now to work on rotation and scale DPoint3d translation = m_firstPoint; DMatrix3d viewMatrix = ev.Viewport.GetRotation(); DPoint3d[] blkPts = new DPoint3d[4]; // rotate points to orthogonal blkPts[0] = new DPoint3d(viewMatrix.Multiply(new DVector3d(m_firstPoint))); blkPts[2] = new DPoint3d(viewMatrix.Multiply(new DVector3d(ev.Point))); blkPts[2].Z = blkPts[0].Z; DPoint3d ext = DPoint3d.Subtract(blkPts[2], blkPts[0]); DVector3d angleVec = new DVector3d(ext); double dScale = Math.Max(0.1, Math.Abs(ext.Magnitude / uorPerMaster())); invertedViewportRotation.ScaleInPlace(dScale); DMatrix3d scaleRotateInViewRotateAroundPoint = DMatrix3d.Multiply(invertedViewportRotation, DMatrix3d.Rotation(2, angleVec.AngleXY)); DTransform3d translateAndRotatetoUpInViewAndScale = DTransform3d.FromMatrixAndTranslation(scaleRotateInViewRotateAroundPoint, translation); TransformInfo transformInfo2 = new TransformInfo(translateAndRotatetoUpInViewAndScale); copiedElement.ApplyTransform(transformInfo2); } redrawElems.DoRedraw(copiedElement); } } } } catch (Exception ex) { BPSUtilities.WriteLog($"{ex.Message}\n{ex.StackTrace}"); } // if (!m_haveFirstPoint) //{ // BPSUtilities.WriteLog("Don't have first point."); // // move it around on cursor // redrawElems.DoRedraw(GetTransformedElement(m_element, ev)); //} //else //{ // BPSUtilities.WriteLog("Do have first point."); // redrawElems.DoRedraw(GetTransformedElement(m_element, ev)); //} } else { BPSUtilities.WriteLog("Element is null"); this.EndDynamics(); } } catch (Exception ex) { BPSUtilities.WriteLog($"OnDynamicFrame: {ex.Message}\n{ex.StackTrace}"); } }
protected override void OnDynamicFrame(Bentley.DgnPlatformNET.DgnButtonEvent ev) { RedrawElems redrawElems = new RedrawElems(); redrawElems.SetDynamicsViewsFromActiveViewSet(Bentley.MstnPlatformNET.Session.GetActiveViewport()); redrawElems.DrawMode = DgnDrawMode.TempDraw; redrawElems.DrawPurpose = DrawPurpose.Dynamics; try { DMatrix3d invertedViewportRotation = new DMatrix3d(1, 0, 0, 0, 1, 0, 0, 0, 1); // Identity if (ev.Viewport.GetRotation().TryInvert(out invertedViewportRotation)) { if (CodeElement != null) { if (CodeElement.IsValid) { List <Bentley.DgnPlatformNET.Elements.Element> listChildElements = CodeElement.GetChildren().GetEnumerator().ConvertToList(); Bentley.DgnPlatformNET.Elements.CellHeaderElement codeElement = new CellHeaderElement(Session.Instance.GetActiveDgnModel(), "QRCode", DPoint3d.Zero, DMatrix3d.Identity, listChildElements); if (codeElement.IsValid) { if (m_haveFirstPoint) { // now to work on rotation and scale DPoint3d translation = m_firstPoint; DMatrix3d viewMatrix = ev.Viewport.GetRotation(); DPoint3d[] blkPts = new DPoint3d[4]; // rotate points to orthogonal blkPts[0] = new DPoint3d(viewMatrix.Multiply(new DVector3d(m_firstPoint))); blkPts[2] = new DPoint3d(viewMatrix.Multiply(new DVector3d(ev.Point))); blkPts[2].Z = blkPts[0].Z; DPoint3d ext = DPoint3d.Subtract(blkPts[2], blkPts[0]); DVector3d angleVec = new DVector3d(ext); // double dScale = Math.Max(0.1, Math.Abs(ext.Magnitude / uorPerMaster())); invertedViewportRotation.ScaleInPlace(ext.Magnitude); DVector3d xVec = new DVector3d(1, 0, 0); DVector3d yVec = new DVector3d(0, 1, 0); Angle angle = Angle.Zero; //// UR and LR if (angleVec.AngleTo(xVec).Radians >= 0.0 && angleVec.AngleTo(xVec).Radians <= (Angle.PI.Radians / 2.0)) { if (angleVec.AngleTo(yVec).Radians >= 0.0 && angleVec.AngleTo(yVec).Radians <= (Angle.PI.Radians / 2.0)) { angle = Angle.Zero; } else { angle.Radians = Angle.NEGATIVE_PI.Radians / 2.0; } } // UL and LL else { if (angleVec.AngleTo(yVec).Radians >= 0.0 && angleVec.AngleTo(yVec).Radians <= (Angle.PI.Radians / 2.0)) { angle.Radians = Angle.PI.Radians / 2.0; } else { angle.Radians = Angle.PI.Radians; } } DMatrix3d scaleRotateInViewRotateAroundPoint = DMatrix3d.Multiply(invertedViewportRotation, // DMatrix3d.Rotation(2, angleVec.AngleXY)); DMatrix3d.Rotation(2, angle)); // DMatrix3d scaleRotateInViewRotateAroundPoint = DMatrix3d.Multiply(invertedViewportRotation, // DMatrix3d.Rotation(2, angleVec.AngleXY)); DTransform3d translateAndRotatetoUpInViewAndScale = DTransform3d.FromMatrixAndTranslation(scaleRotateInViewRotateAroundPoint, translation); TransformInfo transformInfo2 = new TransformInfo(translateAndRotatetoUpInViewAndScale); codeElement.ApplyTransform(transformInfo2); // below works great for drawing a block //DPoint3d[] blkPts = new DPoint3d[4]; //DMatrix3d viewMatrix = ev.Viewport.GetRotation(); //// rotate points to orthogonal //blkPts[0] = new DPoint3d(viewMatrix.Multiply(new DVector3d(m_firstPoint))); //blkPts[2] = new DPoint3d(viewMatrix.Multiply(new DVector3d(ev.Point))); //blkPts[2].Z = blkPts[0].Z; //blkPts[1].X = blkPts[0].X; //blkPts[1].Y = blkPts[2].Y; //blkPts[1].Z = blkPts[0].Z; //blkPts[3].X = blkPts[2].X; //blkPts[3].Y = blkPts[0].Y; //blkPts[3].Z = blkPts[0].Z; //DVector3d dVec = new DVector3d(blkPts[0], blkPts[2]); //double dWidth = blkPts[0].Distance(blkPts[1]); //double dHeight = blkPts[0].Distance(blkPts[3]); //double dDelta = Math.Abs(dWidth); //if (Math.Abs(dHeight) > Math.Abs(dWidth)) // dDelta = Math.Abs(dHeight); //blkPts[3] = blkPts[2] = blkPts[1] = blkPts[0]; //DVector3d xVec = new DVector3d(1, 0, 0); //DVector3d yVec = new DVector3d(0, 1, 0); //double xFactor = 1.0, yFactor = 1.0; //// UR and LR //if (dVec.AngleTo(xVec).Radians >= 0.0 && dVec.AngleTo(xVec).Radians <= (Angle.PI.Radians / 2.0)) //{ // if (dVec.AngleTo(yVec).Radians >= 0.0 && dVec.AngleTo(yVec).Radians <= (Angle.PI.Radians / 2.0)) // { // blkPts[2].X = blkPts[0].X + dDelta; // blkPts[2].Y = blkPts[0].Y + dDelta; // } // else // { // blkPts[2].X = blkPts[0].X + dDelta; // blkPts[2].Y = blkPts[0].Y - dDelta; // yFactor = -1.0; // } //} //// UL and LL //else //{ // if (dVec.AngleTo(yVec).Radians >= 0.0 && dVec.AngleTo(yVec).Radians <= (Angle.PI.Radians / 2.0)) // { // blkPts[2].X = blkPts[0].X - dDelta; // blkPts[2].Y = blkPts[0].Y + dDelta; // xFactor = -1.0; // } // else // { // blkPts[2].X = blkPts[0].X - dDelta; // blkPts[2].Y = blkPts[0].Y - dDelta; // xFactor = -1.0; // yFactor = -1.0; // } //} //blkPts[1].X = blkPts[0].X; //blkPts[1].Y = blkPts[2].Y; //blkPts[1].Z = blkPts[0].Z; //blkPts[3].X = blkPts[2].X; //blkPts[3].Y = blkPts[0].Y; //blkPts[3].Z = blkPts[0].Z; //DPoint3d[] blkPts2 = new DPoint3d[4]; //blkPts2[0] = blkPts2[1] = blkPts2[2] = blkPts2[3] = blkPts[0]; //for (int i = 0; i < 4; i++) //{ // blkPts[i] = new DPoint3d(invertedViewportRotation.Multiply(new DVector3d(blkPts[i]))); //} //Bentley.DgnPlatformNET.Elements.ShapeElement shapeElement = // new Bentley.DgnPlatformNET.Elements.ShapeElement(Session.Instance.GetActiveDgnModel(), null, blkPts); //blkPts2[0].X += (xFactor) * dDelta / 4.0; //blkPts2[0].Y += (yFactor) * dDelta / 4.0; //blkPts2[2].X += (xFactor) * 3.0 * (dDelta / 4.0); //blkPts2[2].Y += (yFactor) * 3.0 * (dDelta / 4.0); //blkPts2[1].X = blkPts2[0].X; //blkPts2[1].Y = blkPts2[2].Y; //blkPts2[1].Z = blkPts2[0].Z; //blkPts2[3].X = blkPts2[2].X; //blkPts2[3].Y = blkPts2[0].Y; //blkPts2[3].Z = blkPts2[0].Z; //for (int i = 0; i < 4; i++) //{ // blkPts2[i] = new DPoint3d(invertedViewportRotation.Multiply(new DVector3d(blkPts2[i]))); //} //Bentley.DgnPlatformNET.Elements.ShapeElement shapeElement2 = // new Bentley.DgnPlatformNET.Elements.ShapeElement(Session.Instance.GetActiveDgnModel(), null, blkPts2); //redrawElems.DoRedraw(shapeElement); //redrawElems.DoRedraw(shapeElement2); } else { // picking something arbitrary to use as scale factor invertedViewportRotation.ScaleInPlace(Bentley.MstnPlatformNET.Settings.TextHeight); DTransform3d scaleAndRotateToUpInView = DTransform3d.FromMatrixAndTranslation(invertedViewportRotation, ev.Point); TransformInfo transformInfo = new TransformInfo(scaleAndRotateToUpInView); codeElement.ApplyTransform(transformInfo); } redrawElems.DoRedraw(codeElement); } } } } } catch (Exception ex) { BPSUtilities.WriteLog($"{ex.Message}\n{ex.StackTrace}"); } }
protected override bool OnDataButton(DgnButtonEvent ev) { try { if (m_haveFirstPoint) { // we're going to write the element base.EndDynamics(); // now to work on rotation and scale DPoint3d translation = m_firstPoint; DMatrix3d viewMatrix = ev.Viewport.GetRotation(); DPoint3d[] blkPts = new DPoint3d[4]; // rotate points to orthogonal blkPts[0] = new DPoint3d(viewMatrix.Multiply(new DVector3d(m_firstPoint))); blkPts[2] = new DPoint3d(viewMatrix.Multiply(new DVector3d(ev.Point))); blkPts[2].Z = blkPts[0].Z; DPoint3d ext = DPoint3d.Subtract(blkPts[2], blkPts[0]); DVector3d angleVec = new DVector3d(ext); double dScale = Math.Max(0.1, Math.Abs(ext.Magnitude / uorPerMaster())); //RedrawElems redrawElems = new RedrawElems(); //redrawElems.SetDynamicsViewsFromActiveViewSet(Bentley.MstnPlatformNET.Session.GetActiveViewport()); //redrawElems.DrawMode = DgnDrawMode.Normal; //redrawElems.DrawPurpose = DrawPurpose.ForceRedraw; try { DMatrix3d invertedViewportRotation = new DMatrix3d(1, 0, 0, 0, 1, 0, 0, 0, 1); // Identity if (ev.Viewport.GetRotation().TryInvert(out invertedViewportRotation)) { DMatrix3d cellRotation = new DMatrix3d(1, 0, 0, 0, 1, 0, 0, 0, 1); // Identity List <Bentley.DgnPlatformNET.Elements.Element> listChildElements = new List <Bentley.DgnPlatformNET.Elements.Element>(); foreach (Bentley.DgnPlatformNET.Elements.Element child in PolyhedraCE.StaticElement.GetChildren()) { listChildElements.Add(child); } Bentley.DgnPlatformNET.Elements.CellHeaderElement copiedElement = new CellHeaderElement(Session.Instance.GetActiveDgnModel(), PolyhedronName, new DPoint3d(0, 0, 0), cellRotation, listChildElements); if (copiedElement != null) { if (copiedElement.IsValid) { invertedViewportRotation.ScaleInPlace(dScale); DMatrix3d scaleRotateInViewRotateAroundPoint = DMatrix3d.Multiply(invertedViewportRotation, DMatrix3d.Rotation(2, angleVec.AngleXY)); DTransform3d translateAndRotatetoUpInViewAndScale = DTransform3d.FromMatrixAndTranslation(scaleRotateInViewRotateAroundPoint, translation); TransformInfo transformInfo2 = new TransformInfo(translateAndRotatetoUpInViewAndScale); copiedElement.ApplyTransform(transformInfo2); copiedElement.AddToModel(); BPSUtilities.WriteLog("Added element to model"); RedrawElems redrawElems = new RedrawElems(); redrawElems.SetDynamicsViewsFromActiveViewSet(ev.Viewport); redrawElems.DrawMode = DgnDrawMode.Normal; redrawElems.DrawPurpose = DrawPurpose.ForceRedraw; redrawElems.DoRedraw(copiedElement); } } } } catch (Exception ex) { BPSUtilities.WriteLog($"OnDataBurron {ex.Message}\n{ex.StackTrace}"); } m_haveFirstPoint = false; m_firstPoint = new DPoint3d(0, 0, 0); base.BeginDynamics(); return(true); } m_haveFirstPoint = true; m_firstPoint = ev.Point; base.BeginDynamics(); } catch (Exception ex) { BPSUtilities.WriteLog($"OnDataButton {ex.Message}\n{ex.StackTrace}"); } return(true); }
protected override bool OnDataButton(DgnButtonEvent ev) { try { if (m_haveFirstPoint) { // we're going to write the element base.EndDynamics(); if (CodeElement != null) { if (CodeElement.IsValid) { List <Bentley.DgnPlatformNET.Elements.Element> listChildElements = CodeElement.GetChildren().GetEnumerator().ConvertToList(); Bentley.DgnPlatformNET.Elements.CellHeaderElement codeElement = new CellHeaderElement(Session.Instance.GetActiveDgnModel(), "QRCode", DPoint3d.Zero, DMatrix3d.Identity, listChildElements); if (codeElement.IsValid) { DMatrix3d invertedViewportRotation = new DMatrix3d(1, 0, 0, 0, 1, 0, 0, 0, 1); // Identity if (ev.Viewport.GetRotation().TryInvert(out invertedViewportRotation)) { // now to work on rotation and scale DPoint3d translation = m_firstPoint; DMatrix3d viewMatrix = ev.Viewport.GetRotation(); DPoint3d[] blkPts = new DPoint3d[4]; // rotate points to orthogonal blkPts[0] = new DPoint3d(viewMatrix.Multiply(new DVector3d(m_firstPoint))); blkPts[2] = new DPoint3d(viewMatrix.Multiply(new DVector3d(ev.Point))); blkPts[2].Z = blkPts[0].Z; DPoint3d ext = DPoint3d.Subtract(blkPts[2], blkPts[0]); DVector3d angleVec = new DVector3d(ext); // double dScale = Math.Max(0.1, Math.Abs(ext.Magnitude / uorPerMaster())); invertedViewportRotation.ScaleInPlace(ext.Magnitude); DVector3d xVec = new DVector3d(1, 0, 0); DVector3d yVec = new DVector3d(0, 1, 0); Angle angle = Angle.Zero; //// UR and LR if (angleVec.AngleTo(xVec).Radians >= 0.0 && angleVec.AngleTo(xVec).Radians <= (Angle.PI.Radians / 2.0)) { if (angleVec.AngleTo(yVec).Radians >= 0.0 && angleVec.AngleTo(yVec).Radians <= (Angle.PI.Radians / 2.0)) { angle = Angle.Zero; } else { angle.Radians = Angle.NEGATIVE_PI.Radians / 2.0; } } // UL and LL else { if (angleVec.AngleTo(yVec).Radians >= 0.0 && angleVec.AngleTo(yVec).Radians <= (Angle.PI.Radians / 2.0)) { angle.Radians = Angle.PI.Radians / 2.0; } else { angle.Radians = Angle.PI.Radians; } } DMatrix3d scaleRotateInViewRotateAroundPoint = DMatrix3d.Multiply(invertedViewportRotation, // DMatrix3d.Rotation(2, angleVec.AngleXY)); DMatrix3d.Rotation(2, angle)); DTransform3d translateAndRotatetoUpInViewAndScale = DTransform3d.FromMatrixAndTranslation(scaleRotateInViewRotateAroundPoint, translation); TransformInfo transformInfo2 = new TransformInfo(translateAndRotatetoUpInViewAndScale); codeElement.ApplyTransform(transformInfo2); //DPoint3d[] blkPts = new DPoint3d[4]; //DMatrix3d viewMatrix = ev.Viewport.GetRotation(); //// rotate points to orthogonal //blkPts[0] = new DPoint3d(viewMatrix.Multiply(new DVector3d(m_firstPoint))); //blkPts[2] = new DPoint3d(viewMatrix.Multiply(new DVector3d(ev.Point))); //blkPts[2].Z = blkPts[0].Z; //blkPts[1].X = blkPts[0].X; //blkPts[1].Y = blkPts[2].Y; //blkPts[1].Z = blkPts[0].Z; //blkPts[3].X = blkPts[2].X; //blkPts[3].Y = blkPts[0].Y; //blkPts[3].Z = blkPts[0].Z; //DVector3d dVec = new DVector3d(blkPts[0], blkPts[2]); //double dWidth = blkPts[0].Distance(blkPts[1]); //double dHeight = blkPts[0].Distance(blkPts[3]); //double dDelta = Math.Max(Math.Abs(dWidth), Math.Abs(dHeight)); //blkPts[3] = blkPts[2] = blkPts[1] = blkPts[0]; //DVector3d xVec = new DVector3d(1, 0, 0); //DVector3d yVec = new DVector3d(0, 1, 0); //// UR and LR //if (dVec.AngleTo(xVec).Radians >= 0.0 && dVec.AngleTo(xVec).Radians <= (Angle.PI.Radians / 2.0)) //{ // if (dVec.AngleTo(yVec).Radians >= 0.0 && dVec.AngleTo(yVec).Radians <= (Angle.PI.Radians / 2.0)) // { // blkPts[2].X = blkPts[0].X + dDelta; // blkPts[2].Y = blkPts[0].Y + dDelta; // } // else // { // blkPts[2].X = blkPts[0].X + dDelta; // blkPts[2].Y = blkPts[0].Y - dDelta; // } //} //// UL and LL //else //{ // if (dVec.AngleTo(yVec).Radians >= 0.0 && dVec.AngleTo(yVec).Radians <= (Angle.PI.Radians / 2.0)) // { // blkPts[2].X = blkPts[0].X - dDelta; // blkPts[2].Y = blkPts[0].Y + dDelta; // } // else // { // blkPts[2].X = blkPts[0].X - dDelta; // blkPts[2].Y = blkPts[0].Y - dDelta; // } //} //blkPts[1].X = blkPts[0].X; //blkPts[1].Y = blkPts[2].Y; //blkPts[1].Z = blkPts[0].Z; //blkPts[3].X = blkPts[2].X; //blkPts[3].Y = blkPts[0].Y; //blkPts[3].Z = blkPts[0].Z; //for (int i = 0; i < 4; i++) //{ // blkPts[i] = new DPoint3d(invertedViewportRotation.Multiply(new DVector3d(blkPts[i]))); //} //Bentley.DgnPlatformNET.Elements.ShapeElement shapeElement = // new Bentley.DgnPlatformNET.Elements.ShapeElement(Session.Instance.GetActiveDgnModel(), null, blkPts); RedrawElems redrawElems = new RedrawElems(); redrawElems.SetDynamicsViewsFromActiveViewSet(Bentley.MstnPlatformNET.Session.GetActiveViewport()); redrawElems.DrawMode = DgnDrawMode.Normal; redrawElems.DrawPurpose = DrawPurpose.ForceRedraw; codeElement.AddToModel(); redrawElems.DoRedraw(codeElement); m_haveFirstPoint = false; m_firstPoint = new DPoint3d(0, 0, 0); base.BeginDynamics(); return(true); } } } } } else { m_haveFirstPoint = true; m_firstPoint = ev.Point; // base.BeginDynamics(); } } catch (Exception ex) { BPSUtilities.WriteLog($"OnDataButton {ex.Message}\n{ex.StackTrace}"); } return(true); }