/// <summary> /// Sows as L panel. /// </summary> /// <param name="doc">The active document.</param> /// <param name="tr">The active transaction.</param> protected RivieraObject InsertLPanel(RivieraObject obj, ArrowDirection direction, params RivieraMeasure[] sizes) { //1: Se calcula la dirección y orientación del panel Point3d end, start; //Siempre se inserta en la posición inicial del bloque insertado //Selección de la dirección start = obj.Start.ToPoint3d(); end = direction.IsFront() ? start.ToPoint2d().ToPoint2dByPolar(1, obj.Angle).ToPoint3d() //Misma dirección : start.ToPoint2d().ToPoint2dByPolar(1, obj.Angle + Math.PI).ToPoint3d(); //Dirección Invertida //Selección de la rotación SweepDirection rotation = direction.IsLeft() ? SweepDirection.Counterclockwise : SweepDirection.Clockwise; //Seleccion de tipo de L BordeoLPanelAngle lAng = direction.GetArrowDirectionName().Contains("90") ? BordeoLPanelAngle.ANG_90 : BordeoLPanelAngle.ANG_135; //Se convierten los tamaños a tamaños de bordeo IEnumerable <LPanelMeasure> pSizes = sizes.Select(x => x as LPanelMeasure); //El panel inferios se usa como distancia base del arreglo de paneles. var first = sizes[0] as LPanelMeasure; //Se crea el panel BordeoLPanelStack stack = new BordeoLPanelStack(start, end, first, rotation, lAng); //Se agregan los tamaños superiores for (int i = 1; i < sizes.Length; i++) { stack.AddPanel(sizes[i] as LPanelMeasure); } //Se dibuja en el plano y se borra el panel anterior RivieraObject objParent = obj.GetParent(); this.DrawObjects((Document doc, Transaction tr, RivieraObject[] objs) => obj.Delete(tr), stack); if (objParent != null) { objParent.Connect(direction, stack); } else { var db = App.Riviera.Database.Objects; if (db.FirstOrDefault(x => x.Handle.Value == stack.Handle.Value) == null) { db.Add(stack); } } //Se regresa el stack como objeto creado return(stack); }
/// <summary> /// Sows as Linear panel. /// </summary> /// <param name="doc">The active document.</param> /// <param name="tr">The active transaction.</param> protected RivieraObject InsertLinearPanel(RivieraObject obj, ArrowDirection direction, params RivieraMeasure[] sizes) { //1: Se calcula la dirección y orientación del panel Point3d end, start; if (direction == ArrowDirection.FRONT) //Misma dirección { if (obj is BordeoLPanelStack) { Polyline pl = (obj as BordeoLPanelStack).FirstOrDefault().PanelGeometry; start = obj.End.ToPoint3d(); double angle = pl.GetPoint2dAt(2).GetVectorTo(pl.GetPoint2dAt(3)).Angle; end = start.ToPoint2d().ToPoint2dByPolar(1, angle).ToPoint3d(); } else { start = obj.End.ToPoint3d(); end = start.ToPoint2d().ToPoint2dByPolar(1, obj.Angle).ToPoint3d(); } } else //Se invierte la dirección { start = obj.Start.ToPoint3d(); end = start.ToPoint2d().ToPoint2dByPolar(1, obj.Angle + Math.PI).ToPoint3d(); } //Se convierten los tamaños a tamaños de bordeo IEnumerable <PanelMeasure> pSizes = sizes.Select(x => x as PanelMeasure); //El panel inferios se usa como distancia base del arreglo de paneles. var first = sizes[0] as PanelMeasure; //Se crea el panel BordeoPanelStack stack = new BordeoPanelStack(start, end, first); //Se agregan los tamaños superiores for (int i = 1; i < sizes.Length; i++) { stack.AddPanel(sizes[i] as PanelMeasure); } //Se dibuja en el plano this.DrawObjects(null, stack); obj.Connect(direction, stack); //Se regresa el stack como objeto creado return(stack); }