private void WritePenElement(System.Xml.XmlWriter writer, FlowChartX.Pen pen, string element, SortedList brushes) { if(pen == null) return; writer.WriteStartElement(element); if(pen.Brush != null) { int bi = brushes.IndexOfValue(pen.Brush); writer.WriteStartElement("Brush"); writer.WriteAttributeString("Id", XmlConvert.FromInt32((int)brushes.GetKey(bi))); writer.WriteEndElement(); } writer.WriteElementString("Color", XmlConvert.FromColor(pen.Color)); if(pen.CompoundArray != null) { WriteFloatArrayElement(writer, pen.CompoundArray, "CompoundArray", "Pos"); } writer.WriteElementString("DashOffset", XmlConvert.FromSingle(pen.DashOffset)); if(pen.DashPattern != null) { WriteFloatArrayElement(writer, pen.DashPattern, "DashPattern", "Pos"); } writer.WriteElementString("DashStyle", pen.DashStyle.ToString()); writer.WriteElementString("LineJoint", pen.LineJoin.ToString()); writer.WriteElementString("MiterLimit", XmlConvert.FromSingle(pen.MiterLimit)); writer.WriteElementString("Width", XmlConvert.FromSingle(pen.Width)); writer.WriteEndElement(); }
private void WriteBrushRefElement(System.Xml.XmlWriter writer, FlowChartX.Brush brush, string element, SortedList brushes) { writer.WriteStartElement(element); if(brush != null) { int bi = brushes.IndexOfValue(brush); writer.WriteAttributeString("Id", XmlConvert.FromInt32((int)brushes.GetKey(bi))); } else { writer.WriteAttributeString("Id", "-1"); } writer.WriteEndElement(); }
private void WriteBrushElement(System.Xml.XmlWriter writer, FlowChartX.Brush brush, SortedList brushes) { if(brush == null) return; int ix = brushes.IndexOfValue(brush); if(ix < 0) throw new Exception( "Brush not found in the brush list!"); writer.WriteStartElement("Brush"); writer.WriteAttributeString("Id", XmlConvert.FromInt32((int)brushes.GetKey(ix))); if(brush.GetType().Equals(typeof(FlowChartX.SolidBrush))) { FlowChartX.SolidBrush bb = (FlowChartX.SolidBrush)brush; writer.WriteAttributeString("Type", "Solid"); writer.WriteElementString("Color", XmlConvert.FromColor(bb.Color)); } else if(brush.GetType().Equals(typeof(FlowChartX.HatchBrush))) { FlowChartX.HatchBrush bb = (FlowChartX.HatchBrush)brush; writer.WriteAttributeString("Type", "Hatch"); writer.WriteElementString("ForeColor", XmlConvert.FromColor(bb.ForegroundColor)); writer.WriteElementString("BackColor", XmlConvert.FromColor(bb.BackgroundColor)); writer.WriteElementString("Style", bb.HatchStyle.ToString()); } else if(brush.GetType().Equals(typeof(FlowChartX.LinearGradientBrush))) { FlowChartX.LinearGradientBrush bb = (FlowChartX.LinearGradientBrush)brush; writer.WriteAttributeString("Type", "Gradient"); // Write angle writer.WriteElementString("Angle", XmlConvert.FromSingle(bb.Angle)); // Write blend pattern if(bb.Blend != null) { writer.WriteStartElement("Blend"); WriteFloatArrayElement(writer, bb.Blend.Positions, "Positions", "Pos"); WriteFloatArrayElement(writer, bb.Blend.Factors, "Factors", "Fac"); writer.WriteEndElement(); } // Write linear colors writer.WriteElementString("Color1", XmlConvert.FromColor(bb.LinearColors[0])); writer.WriteElementString("Color2", XmlConvert.FromColor(bb.LinearColors[1])); // Write interpolation colors if(bb.InterpolationColor != null) { writer.WriteStartElement("ColorBlend"); WriteFloatArrayElement(writer, bb.InterpolationColor.Positions, "Positions", "Pos"); writer.WriteStartElement("Colors"); writer.WriteAttributeString("Count", XmlConvert.FromInt32(bb.InterpolationColor.Colors.Length)); for(int j = 0; j < bb.InterpolationColor.Colors.Length; j++) { Color c = (Color) bb.InterpolationColor.Colors.GetValue(j); writer.WriteElementString("Color", XmlConvert.FromColor(c)); } writer.WriteEndElement(); writer.WriteEndElement(); } } else if(brush.GetType().Equals(typeof(FlowChartX.TextureBrush))) { FlowChartX.TextureBrush bb = (FlowChartX.TextureBrush)brush; writer.WriteAttributeString("Type", "Texture"); writer.WriteElementString("WrapMode", bb.WrapMode.ToString()); writer.WriteElementString("Image", Version >= 4 ? XmlConvert.FromImageV4(bb.Image) : XmlConvert.FromImage(bb.Image)); } writer.WriteEndElement(); }
private bool AddBox(RectangleF rect, long ItemID, float RotationAngle, float ShapeOrientation, Image Picture , Color FillColor, Color FrameColor, Color TextColor, Font ShapeFont, bool Transparent, FlowChartX.Pen ItemPen, FlowChartX.Brush ItemBrush, bool IsStyled, string ItemText, BoxStyle ItemStyle, FlowChartX.ShapeTemplate ItemTemplate, RectangleF rectGroup, bool IsGroup, StringAlignment sa) { bool bOk = false, bPicture = false, NoDimChanges = false; double lLeft = 0, lRight = 0, lTop = 0, lBottom = 0, lW = 0, lH = 0, lLeftG = 0,lRightG = 0,lTopG = 0, lBottomG =0,lWG = 0, lHG =0, fTemp = 0; string sTemp = null, sImg = null; XmlNode node_temp = null; try { // Inserting new Box if ( rectGroup != RectangleF.Empty) { sTemp = String.Format("vdx:Shape[@ID='{0}']", ItemID ); shapeNew = shapeRoot.SelectSingleNode(sTemp, ns); if ( shapeNew == null ) shapeNew = groupLast.InsertAfter( shapeTemplate.Clone(), groupLast.LastChild ); else NoDimChanges = true; } else { if (IsGroup) // If the box is main group's frame { shapeNew = shapeRoot.InsertAfter( shapeTemplate.Clone(), shapeRoot.LastChild); } else shapeNew = shapeRoot.InsertAfter( shapeTemplate.Clone(), shapeLast); } if ( shapeNew == null ) return false; // If group is added then creating <Shapes> sub-tree /* * * ROTATION * */ if ( RotationAngle!=0 ) { float fAngle = RotationAngle + ShapeOrientation; int iSign = ( fAngle<180 ) ? -1 : 1; float fAngle2 = ( fAngle<180 ) ? fAngle : 360 - fAngle; sTemp = String.Format("{0}", iSign*Math.PI*(fAngle2/180)); sTemp = sTemp.Replace(sSeparator, "."); SetShapeAttr("vdx:XForm/vdx:Angle","",shapeNew, sTemp); RemoveNode(shapeNew.SelectSingleNode("vdx:XForm/vdx:Angle", ns),"F",false); } if (IsGroup) { node_temp = shapeNew.InsertAfter(doc.CreateNode(XmlNodeType.Element,"Shapes","http://schemas.microsoft.com/visio/2003/core"), shapeNew.LastChild); if ( node_temp == null ) return false; groupLast = node_temp; } // Setting shape's ID & unique GUID if ( rectGroup == RectangleF.Empty) shapeLast = shapeNew; shapeNew.Attributes["ID"].Value = ItemID.ToString(); sTemp = GetGUID(); if ( sTemp != null ) { shapeNew.Attributes["UniqueID"].Value = sTemp; } lLeft = rect.Left; lRight = rect.Right; lTop = rect.Top; lBottom = rect.Bottom; lW = rect.Width; lH = rect.Height; if (( ShapeOrientation == 90 )|| (ShapeOrientation == 270 )) { double lTemp = lW; lW = lH; lH = lTemp; } if ( Picture != null ) { bPicture = true; sImg = Image2String(Picture); } if (rectGroup!=RectangleF.Empty ) { lLeftG = rectGroup.Left; lRightG = rectGroup.Right; lTopG = rectGroup.Top; lBottomG = rectGroup.Bottom; lWG = rectGroup.Width; lHG = rectGroup.Height; lLeft = lLeft - ( lLeftG ); lTop = lTop - lTopG + lDocY - lHG; } if (!IsGroup) { if ( bPicture ) { // If the box is picture container // If box is PICTURE or OLE Control RemoveNode(shapeNew, "vdx:LayerMem", true); RemoveNode(shapeNew, "vdx:Event", true); RemoveNode(shapeNew, "vdx:Char", true); RemoveNode(shapeNew, "vdx:Text", true); RemoveNode(shapeNew, "vdx:Line", true); RemoveNode(shapeNew, "vdx:Fill", true); RemoveNode(shapeNew, "vdx:Misc", true); RemoveNode(shapeNew, "vdx:Group", true); RemoveNode(shapeNew, "Master", false); shapeNew.Attributes["NameU"].Value = String.Format("Foreign.{0}", ItemID); shapeNew.Attributes["Name"].Value = String.Format("Foreign.{0}", ItemID); shapeNew.Attributes["Type"].Value = "Foreign"; shapeNew.SelectSingleNode("vdx:XForm/vdx:LocPinX", ns).Attributes.RemoveNamedItem("F"); shapeNew.SelectSingleNode("vdx:XForm/vdx:LocPinY", ns).Attributes.RemoveNamedItem("F"); node_temp = shapeNew.SelectSingleNode("vdx:XForm", ns); if ( node_temp!=null) { XmlNode foregin_node = shapeNew.InsertAfter(doc.CreateNode(XmlNodeType.Element,"Foreign","http://schemas.microsoft.com/visio/2003/core"), node_temp); if ( foregin_node!=null) { XmlNode first_node = null, second_node = null; first_node = foregin_node.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ImgOffsetX","http://schemas.microsoft.com/visio/2003/core"), first_node); second_node = foregin_node.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ImgOffsetY","http://schemas.microsoft.com/visio/2003/core"), first_node); second_node = foregin_node.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ImgWidth","http://schemas.microsoft.com/visio/2003/core"), second_node); second_node = foregin_node.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ImgHeight","http://schemas.microsoft.com/visio/2003/core"), second_node); SetShapeDim(shapeNew, "vdx:Foreign/vdx:ImgOffsetX", 0 , false); SetShapeDim(shapeNew, "vdx:Foreign/vdx:ImgOffsetY", 0, false); SetShapeDim(shapeNew, "vdx:Foreign/vdx:ImgWidth", lW , false); SetShapeDim(shapeNew, "vdx:Foreign/vdx:ImgHeight", lH, false); } XmlNode foregin_data_node = shapeNew.InsertAfter(doc.CreateNode(XmlNodeType.Element,"ForeignData","http://schemas.microsoft.com/visio/2003/core"), foregin_node); if ( foregin_data_node!=null) { SetShapeAttr("", "ForeignType",foregin_data_node, "Bitmap"); foregin_data_node.InnerText = sImg; } } } else { // If the box is regular sTemp= SetMasterID(shapeNew,ItemTemplate, ItemStyle, ItemID); if (!NoDimChanges) RemoveNode(shapeNew, "vdx:Group", true); } } else { // If the box is a main group object SetShapeAttr("vdx:Misc/vdx:ObjType","", shapeNew, "8"); SetShapeAttr("","Type", shapeNew, "Group"); RemoveNode(shapeNew, "vdx:LayerMem", true); RemoveNode(shapeNew, "vdx:Event", true); //RemoveNode(shapeNew, "vdx:Char", true); //RemoveNode(shapeNew, "vdx:Text", true); //RemoveNode(shapeNew, "vdx:Line", true); //RemoveNode(shapeNew, "vdx:Fill", true); RemoveNode(shapeNew, "vdx:Foreign", true); RemoveNode(shapeNew, "vdx:ForeignData", true); RemoveNode(shapeNew, "Master", false); RemoveNode(shapeNew, "NameU", false); RemoveNode(shapeNew, "Name", false); sTemp = SetMasterID(shapeNew,ItemTemplate, ItemStyle, ItemID); } // Setting shape's dimensions for Visio XML nodes if (!NoDimChanges) { SetShapeDim(shapeNew, "vdx:XForm/vdx:PinX", lLeft + lW/2, true); SetShapeDim(shapeNew, "vdx:XForm/vdx:PinY", (lDocY - ( lTop + lH/2)), true); SetShapeDim(shapeNew, "vdx:XForm/vdx:Width", lW , true); SetShapeDim(shapeNew, "vdx:XForm/vdx:Height", lH, true) ; SetShapeDim(shapeNew, "vdx:XForm/vdx:LocPinX", lW/2 , true ); SetShapeDim(shapeNew, "vdx:XForm/vdx:LocPinY", lH/2 , true); } if ( bPicture ) return true; // Getting font's parameters if (ShapeFont == null) ShapeFont = pChart.Font; SetShapeFont(shapeNew, ShapeFont); // Setting shape elements colors SetShapeColor(shapeNew, "vdx:Fill/vdx:FillForegnd", FillColor); if ( ItemBrush is MindFusion.FlowChartX.LinearGradientBrush ) { SetShapeColor(shapeNew, "vdx:Fill/vdx:FillBkgnd", (ItemBrush as MindFusion.FlowChartX.LinearGradientBrush).LinearColors[1]); SetShapeAttr("vdx:Fill/vdx:FillPattern","", shapeNew, "36"); } SetShapeColor(shapeNew, "vdx:Char/vdx:Color", TextColor); SetShapeColor(shapeNew, "vdx:Line/vdx:LineColor",FrameColor ); // Getting shape's transparency level if (Transparent) { SetShapeAttr("vdx:Fill/vdx:FillForegndTrans","",shapeNew, "1"); SetShapeAttr("vdx:Line/vdx:LineColorTrans","",shapeNew, "1"); SetShapeAttr("vdx:Fill/vdx:FillPattern","", shapeNew, "0"); } else { if (( FillColor == Color.Transparent ) || ( FillColor.A == 0 )) { SetShapeAttr("vdx:Fill/vdx:FillForegndTrans","",shapeNew, "1"); SetShapeAttr("vdx:Fill/vdx:FillPattern","", shapeNew, "0"); } else { fTemp = (1 - FillColor.A)/ 255; sTemp = String.Format("{0}", fTemp); SetShapeAttr("vdx:Fill/vdx:FillForegndTrans","",shapeNew, sTemp); } if ( FrameColor == Color.Transparent ) { SetShapeAttr("vdx:Line/vdx:LineColorTrans","",shapeNew, "1"); } } // Setting shape's text SetText(shapeNew, ItemText, IsStyled , ShapeFont, sa); // Getting line width & pattern fTemp = ItemPen.Width / PixPerInch; sTemp = String.Format("{0}", fTemp); sTemp = sTemp.Replace(sSeparator, "."); SetShapeAttr("vdx:Line/vdx:LineWeight","",shapeNew, sTemp); SetShapeAttr("vdx:Line/vdx:LinePattern","",shapeNew, DashStyle2String(ItemPen.DashStyle)); bOk = true; } catch ( Exception ex ) { Trace.WriteLine(String.Format("Box#{2}({3}) {0} error {1}\n","AddBox",ex.Message, ItemID, ItemText)); bOk = false; } return bOk; }