private void DrawFilledTriangle(Wpg.WordprocessingGroup wordprocessingGroup1, List <Point> points) { UInt32Value atomLabelId = UInt32Value.FromUInt32((uint)m_ooxmlId++); string atomLabelName = "WedgeBond" + atomLabelId; double minX = double.MaxValue; double maxX = double.MinValue; double minY = double.MaxValue; double maxY = double.MinValue; foreach (Point p in points) { maxX = Math.Max(p.X, maxX); minX = Math.Min(p.X, minX); maxY = Math.Max(p.Y, maxY); minY = Math.Min(p.Y, minY); } Rect extents = new Rect(minX, minY, maxX - minX, maxY - minY); // Create modifyable Points Point p0 = new Point(points[0].X, points[0].Y); Point p1 = new Point(points[1].X, points[1].Y); Point p2 = new Point(points[2].X, points[2].Y); // Move Points to have 0,0 Top Left Reference within the drawing canvas p0.Offset(-m_canvasExtents.Left, -m_canvasExtents.Top); p1.Offset(-m_canvasExtents.Left, -m_canvasExtents.Top); p2.Offset(-m_canvasExtents.Left, -m_canvasExtents.Top); // Move shape's extents to correct place in drawing canvas extents.Offset(-m_canvasExtents.Left, -m_canvasExtents.Top); // Move points again to put them inside the shape's extents p0.Offset(-extents.Left, -extents.Top); p1.Offset(-extents.Left, -extents.Top); p2.Offset(-extents.Left, -extents.Top); Int64Value top = OoXmlHelper.ScaleCmlToEmu(extents.Y); Int64Value left = OoXmlHelper.ScaleCmlToEmu(extents.X); Int64Value width = OoXmlHelper.ScaleCmlToEmu(extents.Width); Int64Value height = OoXmlHelper.ScaleCmlToEmu(extents.Height); Wps.WordprocessingShape wordprocessingShape10 = new Wps.WordprocessingShape(); Wps.NonVisualDrawingProperties nonVisualDrawingProperties10 = new Wps.NonVisualDrawingProperties() { Id = atomLabelId, Name = atomLabelName }; Wps.NonVisualDrawingShapeProperties nonVisualDrawingShapeProperties10 = new Wps.NonVisualDrawingShapeProperties(); Wps.ShapeProperties shapeProperties10 = new Wps.ShapeProperties(); A.Transform2D transform2D10 = new A.Transform2D(); A.Offset offset11 = new A.Offset() { X = left, Y = top }; A.Extents extents11 = new A.Extents() { Cx = width, Cy = height }; transform2D10.Append(offset11); transform2D10.Append(extents11); A.CustomGeometry customGeometry10 = new A.CustomGeometry(); A.AdjustValueList adjustValueList10 = new A.AdjustValueList(); A.Rectangle rectangle10 = new A.Rectangle() { Left = "l", Top = "t", Right = "r", Bottom = "b" }; A.PathList pathList10 = new A.PathList(); A.Path path10 = new A.Path() { Width = width, Height = height }; string xCoOrdinate = OoXmlHelper.ScaleCmlToEmu(p0.X).ToString(); string yCoOrdinate = OoXmlHelper.ScaleCmlToEmu(p0.Y).ToString(); A.MoveTo moveTo10 = new A.MoveTo(); A.Point point19 = new A.Point() { X = xCoOrdinate, Y = yCoOrdinate }; moveTo10.Append(point19); path10.Append(moveTo10); xCoOrdinate = OoXmlHelper.ScaleCmlToEmu(p1.X).ToString(); yCoOrdinate = OoXmlHelper.ScaleCmlToEmu(p1.Y).ToString(); A.LineTo lineTo10 = new A.LineTo(); A.Point point20 = new A.Point() { X = xCoOrdinate, Y = yCoOrdinate }; lineTo10.Append(point20); path10.Append(lineTo10); xCoOrdinate = OoXmlHelper.ScaleCmlToEmu(p2.X).ToString(); yCoOrdinate = OoXmlHelper.ScaleCmlToEmu(p2.Y).ToString(); A.LineTo lineTo19 = new A.LineTo(); A.Point point29 = new A.Point() { X = xCoOrdinate, Y = yCoOrdinate }; lineTo19.Append(point29); path10.Append(lineTo19); A.CloseShapePath closeShapePath1 = new A.CloseShapePath(); path10.Append(closeShapePath1); pathList10.Append(path10); customGeometry10.Append(adjustValueList10); customGeometry10.Append(rectangle10); customGeometry10.Append(pathList10); A.SolidFill solidFill10 = new A.SolidFill(); A.RgbColorModelHex rgbColorModelHex10 = new A.RgbColorModelHex() { Val = "000000" }; A.Alpha alpha10 = new A.Alpha() { Val = new Int32Value() { InnerText = "100%" } }; rgbColorModelHex10.Append(alpha10); solidFill10.Append(rgbColorModelHex10); shapeProperties10.Append(transform2D10); shapeProperties10.Append(customGeometry10); shapeProperties10.Append(solidFill10); Wps.ShapeStyle shapeStyle10 = new Wps.ShapeStyle(); A.LineReference lineReference10 = new A.LineReference() { Index = (UInt32Value)0U }; A.FillReference fillReference10 = new A.FillReference() { Index = (UInt32Value)0U }; A.EffectReference effectReference10 = new A.EffectReference() { Index = (UInt32Value)0U }; A.FontReference fontReference10 = new A.FontReference() { Index = A.FontCollectionIndexValues.Minor }; shapeStyle10.Append(lineReference10); shapeStyle10.Append(fillReference10); shapeStyle10.Append(effectReference10); shapeStyle10.Append(fontReference10); Wps.TextBodyProperties textBodyProperties10 = new Wps.TextBodyProperties(); wordprocessingShape10.Append(nonVisualDrawingProperties10); wordprocessingShape10.Append(nonVisualDrawingShapeProperties10); wordprocessingShape10.Append(shapeProperties10); wordprocessingShape10.Append(shapeStyle10); wordprocessingShape10.Append(textBodyProperties10); wordprocessingGroup1.Append(wordprocessingShape10); }
private void DrawDashedLine(Wpg.WordprocessingGroup wordprocessingGroup1, Rect extents, Point bondStart, Point bondEnd) { UInt32Value bondLineId = UInt32Value.FromUInt32((uint)m_ooxmlId++); string bondLineName = "DashedBondLine" + bondLineId; Int64Value width = OoXmlHelper.ScaleCmlToEmu(extents.Width); Int64Value height = OoXmlHelper.ScaleCmlToEmu(extents.Height); Int64Value top = OoXmlHelper.ScaleCmlToEmu(extents.Top); Int64Value left = OoXmlHelper.ScaleCmlToEmu(extents.Left); Wps.WordprocessingShape wordprocessingShape1 = new Wps.WordprocessingShape(); Wps.NonVisualDrawingProperties nonVisualDrawingProperties1 = new Wps.NonVisualDrawingProperties() { Id = bondLineId, Name = bondLineName }; Wps.NonVisualDrawingShapeProperties nonVisualDrawingShapeProperties1 = new Wps.NonVisualDrawingShapeProperties(); Wps.ShapeProperties shapeProperties1 = new Wps.ShapeProperties(); A.Transform2D transform2D1 = new A.Transform2D(); A.Offset offset2 = new A.Offset() { X = left, Y = top }; A.Extents extents2 = new A.Extents() { Cx = width, Cy = height }; transform2D1.Append(offset2); transform2D1.Append(extents2); A.CustomGeometry customGeometry1 = new A.CustomGeometry(); A.AdjustValueList adjustValueList1 = new A.AdjustValueList(); A.Rectangle rectangle1 = new A.Rectangle() { Left = "l", Top = "t", Right = "r", Bottom = "b" }; A.PathList pathList1 = new A.PathList(); A.Path path1 = new A.Path() { Width = width, Height = height }; A.MoveTo moveTo1 = new A.MoveTo(); A.Point point1 = new A.Point() { X = OoXmlHelper.ScaleCmlToEmu(bondStart.X).ToString(), Y = OoXmlHelper.ScaleCmlToEmu(bondStart.Y).ToString() }; moveTo1.Append(point1); A.LineTo lineTo1 = new A.LineTo(); A.Point point2 = new A.Point() { X = OoXmlHelper.ScaleCmlToEmu(bondEnd.X).ToString(), Y = OoXmlHelper.ScaleCmlToEmu(bondEnd.Y).ToString() }; lineTo1.Append(point2); path1.Append(moveTo1); path1.Append(lineTo1); pathList1.Append(path1); customGeometry1.Append(adjustValueList1); customGeometry1.Append(rectangle1); customGeometry1.Append(pathList1); A.Outline outline1 = new A.Outline() { Width = 9525, CapType = A.LineCapValues.Round }; A.SolidFill solidFill1 = new A.SolidFill(); A.PresetDash presetDash1 = new A.PresetDash() { Val = A.PresetLineDashValues.LargeDash }; A.RgbColorModelHex rgbColorModelHex1 = new A.RgbColorModelHex() { Val = "000000" }; A.Alpha alpha1 = new A.Alpha() { Val = new Int32Value() { InnerText = "100%" } }; rgbColorModelHex1.Append(alpha1); solidFill1.Append(rgbColorModelHex1); outline1.Append(solidFill1); outline1.Append(presetDash1); shapeProperties1.Append(transform2D1); shapeProperties1.Append(customGeometry1); shapeProperties1.Append(outline1); Wps.ShapeStyle shapeStyle1 = new Wps.ShapeStyle(); A.LineReference lineReference1 = new A.LineReference() { Index = (UInt32Value)0U }; A.FillReference fillReference1 = new A.FillReference() { Index = (UInt32Value)0U }; A.EffectReference effectReference1 = new A.EffectReference() { Index = (UInt32Value)0U }; A.FontReference fontReference1 = new A.FontReference() { Index = A.FontCollectionIndexValues.Minor }; shapeStyle1.Append(lineReference1); shapeStyle1.Append(fillReference1); shapeStyle1.Append(effectReference1); shapeStyle1.Append(fontReference1); Wps.TextBodyProperties textBodyProperties1 = new Wps.TextBodyProperties(); wordprocessingShape1.Append(nonVisualDrawingProperties1); wordprocessingShape1.Append(nonVisualDrawingShapeProperties1); wordprocessingShape1.Append(shapeProperties1); wordprocessingShape1.Append(shapeStyle1); wordprocessingShape1.Append(textBodyProperties1); wordprocessingGroup1.Append(wordprocessingShape1); }
private void DrawWavyLine(Wpg.WordprocessingGroup wordprocessingGroup1, Rect extents, Point bondStart, Point bondEnd) { UInt32Value bondLineId = UInt32Value.FromUInt32((uint)m_ooxmlId++); string bondLineName = "WavyLine" + bondLineId; Vector bondVector = bondEnd - bondStart; int noOfWiggles = (int)Math.Ceiling(bondVector.Length / BondOffset()); if (noOfWiggles < 1) { noOfWiggles = 1; } double wiggleLength = bondVector.Length / noOfWiggles; Debug.WriteLine($"v.Length: {bondVector.Length} noOfWiggles: {noOfWiggles}"); Vector originalWigglePortion = bondVector; originalWigglePortion.Normalize(); originalWigglePortion *= wiggleLength / 2; Matrix toLeft = new Matrix(); toLeft.Rotate(-60); Matrix toRight = new Matrix(); toRight.Rotate(60); Vector leftVector = originalWigglePortion * toLeft; Vector rightVector = originalWigglePortion * toRight; List <Point> allpoints = new List <Point>(); List <List <Point> > allTriangles = new List <List <Point> >(); List <Point> triangle = new List <Point>(); Point lastPoint = bondStart; allpoints.Add(lastPoint); triangle.Add(lastPoint); for (int i = 0; i < noOfWiggles; i++) { Point leftPoint = lastPoint + leftVector; allpoints.Add(leftPoint); triangle.Add(leftPoint); Point midPoint = lastPoint + originalWigglePortion; allpoints.Add(midPoint); triangle.Add(midPoint); allTriangles.Add(triangle); triangle = new List <Point>(); triangle.Add(midPoint); Point rightPoint = lastPoint + originalWigglePortion + rightVector; allpoints.Add(rightPoint); triangle.Add(rightPoint); lastPoint += originalWigglePortion * 2; allpoints.Add(lastPoint); triangle.Add(lastPoint); allTriangles.Add(triangle); triangle = new List <Point>(); triangle.Add(lastPoint); } double minX = double.MaxValue; double maxX = double.MinValue; double minY = double.MaxValue; double maxY = double.MinValue; foreach (Point p in allpoints) { maxX = Math.Max(p.X + extents.Left, maxX); minX = Math.Min(p.X + extents.Left, minX); maxY = Math.Max(p.Y + extents.Top, maxY); minY = Math.Min(p.Y + extents.Top, minY); } Rect newExtents = new Rect(minX, minY, maxX - minX, maxY - minY); double xOffset = extents.Left - newExtents.Left; double yOffset = extents.Top - newExtents.Top; Int64Value width = OoXmlHelper.ScaleCmlToEmu(newExtents.Width); Int64Value height = OoXmlHelper.ScaleCmlToEmu(newExtents.Height); Int64Value top = OoXmlHelper.ScaleCmlToEmu(newExtents.Top); Int64Value left = OoXmlHelper.ScaleCmlToEmu(newExtents.Left); Wps.WordprocessingShape wordprocessingShape1 = new Wps.WordprocessingShape(); Wps.NonVisualDrawingProperties nonVisualDrawingProperties1 = new Wps.NonVisualDrawingProperties() { Id = bondLineId, Name = bondLineName }; Wps.NonVisualDrawingShapeProperties nonVisualDrawingShapeProperties1 = new Wps.NonVisualDrawingShapeProperties(); Wps.ShapeProperties shapeProperties1 = new Wps.ShapeProperties(); A.Transform2D transform2D1 = new A.Transform2D(); A.Offset offset2 = new A.Offset() { X = left, Y = top }; A.Extents extents2 = new A.Extents() { Cx = width, Cy = height }; transform2D1.Append(offset2); transform2D1.Append(extents2); A.CustomGeometry customGeometry1 = new A.CustomGeometry(); A.AdjustValueList adjustValueList1 = new A.AdjustValueList(); A.Rectangle rectangle1 = new A.Rectangle() { Left = "l", Top = "t", Right = "r", Bottom = "b" }; A.PathList pathList1 = new A.PathList(); A.Path path1 = new A.Path() { Width = width, Height = height }; A.MoveTo moveTo1 = new A.MoveTo(); A.Point point1 = new A.Point() { X = OoXmlHelper.ScaleCmlToEmu(bondStart.X + xOffset).ToString(), Y = OoXmlHelper.ScaleCmlToEmu(bondStart.Y + yOffset).ToString() }; moveTo1.Append(point1); path1.Append(moveTo1); //Curves foreach (var tri in allTriangles) { A.CubicBezierCurveTo cubicBezierCurveTo = new A.CubicBezierCurveTo(); foreach (var p in tri) { A.Point point = new A.Point() { X = OoXmlHelper.ScaleCmlToEmu(p.X + xOffset).ToString(), Y = OoXmlHelper.ScaleCmlToEmu(p.Y + yOffset).ToString() }; cubicBezierCurveTo.Append(point); } path1.Append(cubicBezierCurveTo); } //// Straight Lines //foreach (var p in allpoints) //{ // A.LineTo lineTo = new A.LineTo(); // A.Point point = new A.Point() { X = OoXmlHelper.ScaleCmlToEmu(p.X + xOffset).ToString(), Y = OoXmlHelper.ScaleCmlToEmu(p.Y + yOffset).ToString() }; // lineTo.Append(point); // path1.Append(lineTo); //} pathList1.Append(path1); customGeometry1.Append(adjustValueList1); customGeometry1.Append(rectangle1); customGeometry1.Append(pathList1); A.Outline outline1 = new A.Outline() { Width = 9525, CapType = A.LineCapValues.Round }; A.SolidFill solidFill1 = new A.SolidFill(); A.RgbColorModelHex rgbColorModelHex1 = new A.RgbColorModelHex() { Val = "000000" }; A.Alpha alpha1 = new A.Alpha() { Val = new Int32Value() { InnerText = "100%" } }; rgbColorModelHex1.Append(alpha1); solidFill1.Append(rgbColorModelHex1); outline1.Append(solidFill1); shapeProperties1.Append(transform2D1); shapeProperties1.Append(customGeometry1); shapeProperties1.Append(outline1); Wps.ShapeStyle shapeStyle1 = new Wps.ShapeStyle(); A.LineReference lineReference1 = new A.LineReference() { Index = (UInt32Value)0U }; A.FillReference fillReference1 = new A.FillReference() { Index = (UInt32Value)0U }; A.EffectReference effectReference1 = new A.EffectReference() { Index = (UInt32Value)0U }; A.FontReference fontReference1 = new A.FontReference() { Index = A.FontCollectionIndexValues.Minor }; shapeStyle1.Append(lineReference1); shapeStyle1.Append(fillReference1); shapeStyle1.Append(effectReference1); shapeStyle1.Append(fontReference1); Wps.TextBodyProperties textBodyProperties1 = new Wps.TextBodyProperties(); wordprocessingShape1.Append(nonVisualDrawingProperties1); wordprocessingShape1.Append(nonVisualDrawingShapeProperties1); wordprocessingShape1.Append(shapeProperties1); wordprocessingShape1.Append(shapeStyle1); wordprocessingShape1.Append(textBodyProperties1); wordprocessingGroup1.Append(wordprocessingShape1); }
private void DrawShape(Wpg.WordprocessingGroup wordprocessingGroup1, Rect extents, A.ShapeTypeValues shape, string colour) { UInt32Value bondLineId = UInt32Value.FromUInt32((uint)_ooxmlId++); string bondLineName = "shape" + bondLineId; Int64Value width1 = OoXmlHelper.ScaleCmlToEmu(extents.Width); Int64Value height1 = OoXmlHelper.ScaleCmlToEmu(extents.Height); Int64Value top1 = OoXmlHelper.ScaleCmlToEmu(extents.Top); Int64Value left1 = OoXmlHelper.ScaleCmlToEmu(extents.Left); Point pp1 = new Point(left1, top1); Size ss2 = new Size(width1, height1); pp1.Offset(OoXmlHelper.ScaleCmlToEmu(-_canvasExtents.Left), OoXmlHelper.ScaleCmlToEmu(-_canvasExtents.Top)); Rect boundingBox = new Rect(pp1, ss2); Int64Value width = (Int64Value)boundingBox.Width; Int64Value height = (Int64Value)boundingBox.Height; Int64Value top = (Int64Value)boundingBox.Top; Int64Value left = (Int64Value)boundingBox.Left; A.Extents extents2 = null; A.PresetGeometry presetGeometry1 = null; extents2 = new A.Extents() { Cx = width, Cy = height }; presetGeometry1 = new A.PresetGeometry() { Preset = shape }; Wps.WordprocessingShape wordprocessingShape1 = new Wps.WordprocessingShape(); Wps.NonVisualDrawingProperties nonVisualDrawingProperties1 = new Wps.NonVisualDrawingProperties() { Id = bondLineId, Name = bondLineName }; Wps.NonVisualDrawingShapeProperties nonVisualDrawingShapeProperties1 = new Wps.NonVisualDrawingShapeProperties(); //A.ShapeLocks shapeLocks = new A.ShapeLocks() //{ // NoMove = true, // NoSelection = true //}; //nonVisualDrawingShapeProperties1.Append(shapeLocks); Wps.ShapeProperties shapeProperties1 = new Wps.ShapeProperties(); A.Transform2D transform2D1 = new A.Transform2D(); A.Offset offset2 = new A.Offset() { X = left, Y = top }; transform2D1.Append(offset2); transform2D1.Append(extents2); A.AdjustValueList adjustValueList1 = new A.AdjustValueList(); presetGeometry1.Append(adjustValueList1); A.SolidFill solidFill1 = new A.SolidFill(); A.RgbColorModelHex rgbColorModelHex1 = new A.RgbColorModelHex() { Val = colour }; A.Alpha alpha1 = new A.Alpha() { Val = new Int32Value() { InnerText = "100%" } }; solidFill1.Append(rgbColorModelHex1); shapeProperties1.Append(transform2D1); shapeProperties1.Append(presetGeometry1); shapeProperties1.Append(solidFill1); Wps.ShapeStyle shapeStyle1 = new Wps.ShapeStyle(); A.LineReference lineReference1 = new A.LineReference() { Index = (UInt32Value)0U }; A.FillReference fillReference1 = new A.FillReference() { Index = (UInt32Value)0U }; A.EffectReference effectReference1 = new A.EffectReference() { Index = (UInt32Value)0U }; A.FontReference fontReference1 = new A.FontReference() { Index = A.FontCollectionIndexValues.Minor }; shapeStyle1.Append(lineReference1); shapeStyle1.Append(fillReference1); shapeStyle1.Append(effectReference1); shapeStyle1.Append(fontReference1); Wps.TextBodyProperties textBodyProperties1 = new Wps.TextBodyProperties(); wordprocessingShape1.Append(nonVisualDrawingProperties1); wordprocessingShape1.Append(nonVisualDrawingShapeProperties1); wordprocessingShape1.Append(shapeProperties1); wordprocessingShape1.Append(shapeStyle1); wordprocessingShape1.Append(textBodyProperties1); wordprocessingGroup1.Append(wordprocessingShape1); }
private void DrawBox(Wpg.WordprocessingGroup wordprocessingGroup1, Rect extents, string colour, int thick) { UInt32Value bondLineId = UInt32Value.FromUInt32((uint)_ooxmlId++); string bondLineName = "box" + bondLineId; Int64Value width1 = OoXmlHelper.ScaleCmlToEmu(extents.Width); Int64Value height1 = OoXmlHelper.ScaleCmlToEmu(extents.Height); Int64Value top1 = OoXmlHelper.ScaleCmlToEmu(extents.Top); Int64Value left1 = OoXmlHelper.ScaleCmlToEmu(extents.Left); Point pp1 = new Point(left1, top1); Size ss2 = new Size(width1, height1); pp1.Offset(OoXmlHelper.ScaleCmlToEmu(-_canvasExtents.Left), OoXmlHelper.ScaleCmlToEmu(-_canvasExtents.Top)); Rect boundingBox = new Rect(pp1, ss2); Int64Value width = (Int64Value)boundingBox.Width; Int64Value height = (Int64Value)boundingBox.Height; Int64Value top = (Int64Value)boundingBox.Top; Int64Value left = (Int64Value)boundingBox.Left; Wps.WordprocessingShape wordprocessingShape1 = new Wps.WordprocessingShape(); Wps.NonVisualDrawingProperties nonVisualDrawingProperties1 = new Wps.NonVisualDrawingProperties() { Id = bondLineId, Name = bondLineName }; Wps.NonVisualDrawingShapeProperties nonVisualDrawingShapeProperties1 = new Wps.NonVisualDrawingShapeProperties(); Wps.ShapeProperties shapeProperties1 = new Wps.ShapeProperties(); A.Transform2D transform2D1 = new A.Transform2D(); A.Offset offset2 = new A.Offset() { X = left, Y = top }; A.Extents extents2 = new A.Extents() { Cx = width, Cy = height }; transform2D1.Append(offset2); transform2D1.Append(extents2); A.CustomGeometry customGeometry1 = new A.CustomGeometry(); A.AdjustValueList adjustValueList1 = new A.AdjustValueList(); A.Rectangle rectangle1 = new A.Rectangle() { Left = "l", Top = "t", Right = "r", Bottom = "b" }; A.PathList pathList1 = new A.PathList(); A.Path path1 = new A.Path() { Width = width, Height = height }; // Starting Point A.MoveTo moveTo1 = new A.MoveTo(); A.Point point1 = new A.Point() { X = "0", Y = "0" }; moveTo1.Append(point1); // Mid Point A.LineTo lineTo1 = new A.LineTo(); A.Point point2 = new A.Point() { X = boundingBox.Width.ToString("0"), Y = "0" }; lineTo1.Append(point2); // Mid Point A.LineTo lineTo2 = new A.LineTo(); A.Point point3 = new A.Point() { X = boundingBox.Width.ToString("0"), Y = boundingBox.Height.ToString("0") }; lineTo2.Append(point3); // Last Point A.LineTo lineTo3 = new A.LineTo(); A.Point point4 = new A.Point() { X = "0", Y = boundingBox.Height.ToString("0") }; lineTo3.Append(point4); // Back to Start Point A.LineTo lineTo4 = new A.LineTo(); A.Point point5 = new A.Point() { X = "0", Y = "0" }; lineTo4.Append(point5); path1.Append(moveTo1); path1.Append(lineTo1); path1.Append(lineTo2); path1.Append(lineTo3); path1.Append(lineTo4); pathList1.Append(path1); customGeometry1.Append(adjustValueList1); customGeometry1.Append(rectangle1); customGeometry1.Append(pathList1); A.Outline outline1 = new A.Outline() { Width = thick, CapType = A.LineCapValues.Round }; A.SolidFill solidFill1 = new A.SolidFill(); A.RgbColorModelHex rgbColorModelHex1 = new A.RgbColorModelHex() { Val = colour }; A.Alpha alpha1 = new A.Alpha() { Val = new Int32Value() { InnerText = "100%" } }; rgbColorModelHex1.Append(alpha1); solidFill1.Append(rgbColorModelHex1); outline1.Append(solidFill1); shapeProperties1.Append(transform2D1); shapeProperties1.Append(customGeometry1); shapeProperties1.Append(outline1); Wps.ShapeStyle shapeStyle1 = new Wps.ShapeStyle(); A.LineReference lineReference1 = new A.LineReference() { Index = (UInt32Value)0U }; A.FillReference fillReference1 = new A.FillReference() { Index = (UInt32Value)0U }; A.EffectReference effectReference1 = new A.EffectReference() { Index = (UInt32Value)0U }; A.FontReference fontReference1 = new A.FontReference() { Index = A.FontCollectionIndexValues.Minor }; shapeStyle1.Append(lineReference1); shapeStyle1.Append(fillReference1); shapeStyle1.Append(effectReference1); shapeStyle1.Append(fontReference1); Wps.TextBodyProperties textBodyProperties1 = new Wps.TextBodyProperties(); wordprocessingShape1.Append(nonVisualDrawingProperties1); wordprocessingShape1.Append(nonVisualDrawingShapeProperties1); wordprocessingShape1.Append(shapeProperties1); wordprocessingShape1.Append(shapeStyle1); wordprocessingShape1.Append(textBodyProperties1); wordprocessingGroup1.Append(wordprocessingShape1); }
public Run GenerateRun() { string module = $"{_product}.{_class}.{MethodBase.GetCurrentMethod().Name}()"; _telemetry.Write(module, "Verbose", "Called"); //start off progress monitoring Progress pb = new Progress(); pb.TopLeft = _topLeft; //lists of objects for drawing _atomLabelCharacters = new List<AtomLabelCharacter>(); _bondLines = new List<BondLine>(); Stopwatch swr = new Stopwatch(); Stopwatch sw = new Stopwatch(); //Create a run Run run = new Run(); sw.Start(); swr.Start(); //set the median bond length _medianBondLength = GeometryTool.GetMedianBondLength2D(_chemistryModel.AllBonds); int moleculeNo = 0; foreach (Molecule mol in _chemistryModel.Molecules) { moleculeNo++; // Step 1- gather the atom information together Debug.WriteLine($"{module} Starting Step 1"); //_telemetry.Write(module, "Verbose", $"Starting Step 1 for molecule {moleculeNo}"); ProcessAtoms(mol, pb, moleculeNo, _pt); Debug.WriteLine("Elapsed time " + sw.ElapsedMilliseconds.ToString("##,##0") + "ms"); //_telemetry.Write(module, "Timing", $"Step 1 for molecule {moleculeNo} took " + sw.ElapsedMilliseconds.ToString("#,##0", CultureInfo.InvariantCulture) + "ms"); sw.Reset(); sw.Start(); // Step 2- gather the bond information together Debug.WriteLine($"{module} Starting Step 2"); //_telemetry.Write(module, "Verbose", $"Starting Step 2 for molecule {moleculeNo}"); ProcessBonds(mol, pb, moleculeNo); Debug.WriteLine("Elapsed time " + sw.ElapsedMilliseconds.ToString("##,##0") + "ms"); //_telemetry.Write(module, "Timing", $"Step 2 for molecule {moleculeNo} took " + sw.ElapsedMilliseconds.ToString("#,##0", CultureInfo.InvariantCulture) + "ms"); sw.Reset(); sw.Start(); if (_options.ShowRingCentres) { // Save Rings for later foreach (Ring ring in mol.Rings) { _rings.Add(ring.UniqueID, ring); } } } Debug.WriteLine($"{module} Starting Step 3"); //_telemetry.Write(module, "Verbose", "Starting Step 3"); IncreaseCanvasSize(); Debug.WriteLine("Elapsed time " + sw.ElapsedMilliseconds.ToString("##,##0") + "ms"); //_telemetry.Write(module, "Timing", "Step 3 took " + sw.ElapsedMilliseconds.ToString("#,##0", CultureInfo.InvariantCulture) + "ms"); sw.Reset(); sw.Start(); if (_options.ClipLines) { Debug.WriteLine($"{module} Starting Step 4"); //_telemetry.Write(module, "Verbose", "Starting Step 4"); #region Step 4 - Shrink bond lines ShrinkBondLines(pb); #endregion Step 4 - Shrink bond lines Debug.WriteLine("Elapsed time " + sw.ElapsedMilliseconds.ToString("##,##0") + "ms"); //_telemetry.Write(module, "Timing", "Step 4 took " + sw.ElapsedMilliseconds.ToString("#,##0", CultureInfo.InvariantCulture) + "ms"); sw.Reset(); sw.Start(); } Debug.WriteLine($"{module} Starting Step 5"); //_telemetry.Write(module, "Verbose", "Starting Step 5"); #region Step 5 - Create main OoXml drawing objects Drawing drawing1 = new Drawing(); A.Graphic graphic1 = CreateGraphic(); A.GraphicData graphicData1 = CreateGraphicData(); Wpg.WordprocessingGroup wordprocessingGroup1 = new Wpg.WordprocessingGroup(); // Create Inline Drawing using canvas extents Wp.Inline inline1 = CreateInline(graphicData1, wordprocessingGroup1); // Right-Click Issues - Step 1 of hopefull fix - Add background to force whole object select //DrawShape(wordprocessingGroup1, _canvasExtents, A.ShapeTypeValues.Rectangle, "eeeeee"); #endregion Step 5 - Create main OoXml drawing objects Debug.WriteLine("Elapsed time " + sw.ElapsedMilliseconds.ToString("##,##0") + "ms"); //_telemetry.Write(module, "Timing", "Step 5 took " + sw.ElapsedMilliseconds.ToString("#,##0", CultureInfo.InvariantCulture) + "ms"); sw.Reset(); sw.Start(); #region Step 5a - Diagnostics if (_options.ShowMoleculeBoundingBoxes) { DrawBox(wordprocessingGroup1, _modelExtents, "00ff00", 1); foreach (Molecule mol in _chemistryModel.Molecules) { DrawBox(wordprocessingGroup1, mol.BoundingBox, "0000ff", 1); DrawBox(wordprocessingGroup1, MoleculeExtents(mol), "ff0000", 1); } DrawBox(wordprocessingGroup1, _canvasExtents, "000000", 1); } if (_options.ShowRingCentres) { ShowRingCentres(wordprocessingGroup1); } if (_options.ShowAtomPositions) { ShowAtomCentres(wordprocessingGroup1); } #endregion Step 5a - Diagnostics Debug.WriteLine($"{module} Starting Step 6"); //_telemetry.Write(module, "Verbose", "Starting Step 6"); #region Step 6 - Create and append OoXml objects for all Bond Lines AppendBondOoxml(pb, wordprocessingGroup1); #endregion Step 6 - Create and append OoXml objects for all Bond Lines Debug.WriteLine("Elapsed time " + sw.ElapsedMilliseconds.ToString("##,##0") + "ms"); //_telemetry.Write(module, "Timing", "Step 6 took " + sw.ElapsedMilliseconds.ToString("#,##0", CultureInfo.InvariantCulture) + "ms"); sw.Reset(); sw.Start(); Debug.WriteLine($"{module} Starting Step 7"); //_telemetry.Write(module, "Verbose", "Starting Step 7"); #region Step 7 - Create and append OoXml objects for Atom Labels AppendAtomLabelOoxml(pb, wordprocessingGroup1); #endregion Step 7 - Create and append OoXml objects for Atom Labels Debug.WriteLine("Elapsed time " + sw.ElapsedMilliseconds.ToString("##,##0") + "ms"); //_telemetry.Write(module, "Timing", "Step 7 took " + sw.ElapsedMilliseconds.ToString("#,##0", CultureInfo.InvariantCulture) + "ms"); sw.Reset(); sw.Start(); Debug.WriteLine($"{module} Starting Step 8"); //_telemetry.Write(module, "Verbose", "Starting Step 8"); #region Step 8 - Append OoXml drawing objects to OoXml run object AppendAllOoXml(graphicData1, wordprocessingGroup1, graphic1, inline1, drawing1, run); #endregion Step 8 - Append OoXml drawing objects to OoXml run object Debug.WriteLine("Elapsed time " + sw.ElapsedMilliseconds.ToString("##,##0") + "ms"); //_telemetry.Write(module, "Timing", "Step 8 took " + sw.ElapsedMilliseconds.ToString("#,##0", CultureInfo.InvariantCulture) + "ms"); sw.Reset(); sw.Start(); double abl = _chemistryModel.MeanBondLength; Debug.WriteLine("Elapsed time for GenerateRun " + swr.ElapsedMilliseconds.ToString("#,##0", CultureInfo.InvariantCulture) + "ms"); _telemetry.Write(module, "Timing", $"Rendering {_chemistryModel.Molecules.Count} molecules with {_chemistryModel.AllAtoms.Count} atoms and {_chemistryModel.AllBonds.Count} bonds took {swr.ElapsedMilliseconds.ToString("##,##0")} ms; Average Bond Length: {abl.ToString("#0.00")}"); ShutDownProgress(pb); return run; }
public void DrawCharacter(Wpg.WordprocessingGroup wordprocessingGroup1, AtomLabelCharacter alc) { Point characterPosition = new Point(alc.Position.X, alc.Position.Y); characterPosition.Offset(-m_canvasExtents.Left, -m_canvasExtents.Top); UInt32Value atomLabelId = UInt32Value.FromUInt32((uint)m_ooxmlId++); string atomLabelName = "AtomLabel" + atomLabelId; Int64Value width = OoXmlHelper.ScaleCsTtfToEmu(alc.Character.Width); Int64Value height = OoXmlHelper.ScaleCsTtfToEmu(alc.Character.Height); if (alc.IsSubScript) { width = OoXmlHelper.ScaleCsTtfSubScriptToEmu(alc.Character.Width); height = OoXmlHelper.ScaleCsTtfSubScriptToEmu(alc.Character.Height); } Int64Value top = OoXmlHelper.ScaleCmlToEmu(characterPosition.Y); Int64Value left = OoXmlHelper.ScaleCmlToEmu(characterPosition.X); // Set variable true to show bounding box of (every) character if (m_options.ShowCharacterBoundingBoxes) { Rect boundingBox = new Rect(new Point(left, top), new Size(width, height)); DrawCharacterBox(wordprocessingGroup1, boundingBox, "00ff00", 10); } Wps.WordprocessingShape wordprocessingShape10 = new Wps.WordprocessingShape(); Wps.NonVisualDrawingProperties nonVisualDrawingProperties10 = new Wps.NonVisualDrawingProperties() { Id = atomLabelId, Name = atomLabelName }; Wps.NonVisualDrawingShapeProperties nonVisualDrawingShapeProperties10 = new Wps.NonVisualDrawingShapeProperties(); Wps.ShapeProperties shapeProperties10 = new Wps.ShapeProperties(); A.Transform2D transform2D10 = new A.Transform2D(); A.Offset offset11 = new A.Offset() { X = left, Y = top }; A.Extents extents11 = new A.Extents() { Cx = width, Cy = height }; transform2D10.Append(offset11); transform2D10.Append(extents11); A.CustomGeometry customGeometry10 = new A.CustomGeometry(); A.AdjustValueList adjustValueList10 = new A.AdjustValueList(); A.Rectangle rectangle10 = new A.Rectangle() { Left = "l", Top = "t", Right = "r", Bottom = "b" }; A.PathList pathList10 = new A.PathList(); A.Path path10 = new A.Path() { Width = width, Height = height }; foreach (TtfContour contour in alc.Character.Contours) { int i = 0; while (i < contour.Points.Count) { TtfPoint thisPoint = contour.Points[i]; TtfPoint nextPoint = null; if (i < contour.Points.Count - 1) { nextPoint = contour.Points[i + 1]; } switch (thisPoint.Type) { case TtfPoint.PointType.Start: A.MoveTo moveTo1 = new A.MoveTo(); if (alc.IsSubScript) { A.Point point1 = new A.Point() { X = OoXmlHelper.ScaleCsTtfSubScriptToEmu(thisPoint.X - alc.Character.OriginX).ToString(), Y = OoXmlHelper.ScaleCsTtfSubScriptToEmu(alc.Character.Height + thisPoint.Y - (alc.Character.Height + alc.Character.OriginY)).ToString() }; moveTo1.Append(point1); path10.Append(moveTo1); } else { A.Point point1 = new A.Point() { X = OoXmlHelper.ScaleCsTtfToEmu(thisPoint.X - alc.Character.OriginX).ToString(), Y = OoXmlHelper.ScaleCsTtfToEmu(alc.Character.Height + thisPoint.Y - (alc.Character.Height + alc.Character.OriginY)).ToString() }; moveTo1.Append(point1); path10.Append(moveTo1); } i++; break; case TtfPoint.PointType.Line: A.LineTo lineTo1 = new A.LineTo(); if (alc.IsSubScript) { A.Point point2 = new A.Point() { X = OoXmlHelper.ScaleCsTtfSubScriptToEmu(thisPoint.X - alc.Character.OriginX).ToString(), Y = OoXmlHelper.ScaleCsTtfSubScriptToEmu(alc.Character.Height + thisPoint.Y - (alc.Character.Height + alc.Character.OriginY)).ToString() }; lineTo1.Append(point2); path10.Append(lineTo1); } else { A.Point point2 = new A.Point() { X = OoXmlHelper.ScaleCsTtfToEmu(thisPoint.X - alc.Character.OriginX).ToString(), Y = OoXmlHelper.ScaleCsTtfToEmu(alc.Character.Height + thisPoint.Y - (alc.Character.Height + alc.Character.OriginY)).ToString() }; lineTo1.Append(point2); path10.Append(lineTo1); } i++; break; case TtfPoint.PointType.CurveOff: A.QuadraticBezierCurveTo quadraticBezierCurveTo13 = new A.QuadraticBezierCurveTo(); if (alc.IsSubScript) { A.Point point3 = new A.Point() { X = OoXmlHelper.ScaleCsTtfSubScriptToEmu(thisPoint.X - alc.Character.OriginX).ToString(), Y = OoXmlHelper.ScaleCsTtfSubScriptToEmu(alc.Character.Height + thisPoint.Y - (alc.Character.Height + alc.Character.OriginY)).ToString() }; A.Point point4 = new A.Point() { X = OoXmlHelper.ScaleCsTtfSubScriptToEmu(nextPoint.X - alc.Character.OriginX).ToString(), Y = OoXmlHelper.ScaleCsTtfSubScriptToEmu(alc.Character.Height + nextPoint.Y - (alc.Character.Height + alc.Character.OriginY)).ToString() }; quadraticBezierCurveTo13.Append(point3); quadraticBezierCurveTo13.Append(point4); path10.Append(quadraticBezierCurveTo13); } else { A.Point point3 = new A.Point() { X = OoXmlHelper.ScaleCsTtfToEmu(thisPoint.X - alc.Character.OriginX).ToString(), Y = OoXmlHelper.ScaleCsTtfToEmu(alc.Character.Height + thisPoint.Y - (alc.Character.Height + alc.Character.OriginY)).ToString() }; A.Point point4 = new A.Point() { X = OoXmlHelper.ScaleCsTtfToEmu(nextPoint.X - alc.Character.OriginX).ToString(), Y = OoXmlHelper.ScaleCsTtfToEmu(alc.Character.Height + nextPoint.Y - (alc.Character.Height + alc.Character.OriginY)).ToString() }; quadraticBezierCurveTo13.Append(point3); quadraticBezierCurveTo13.Append(point4); path10.Append(quadraticBezierCurveTo13); } i++; i++; break; case TtfPoint.PointType.CurveOn: // Should never get here ! i++; break; } } A.CloseShapePath closeShapePath1 = new A.CloseShapePath(); path10.Append(closeShapePath1); } pathList10.Append(path10); customGeometry10.Append(adjustValueList10); customGeometry10.Append(rectangle10); customGeometry10.Append(pathList10); A.SolidFill solidFill10 = new A.SolidFill(); // Set Colour A.RgbColorModelHex rgbColorModelHex10 = new A.RgbColorModelHex() { Val = alc.Colour }; A.Alpha alpha10 = new A.Alpha() { Val = new Int32Value() { InnerText = "100%" } }; rgbColorModelHex10.Append(alpha10); solidFill10.Append(rgbColorModelHex10); shapeProperties10.Append(transform2D10); shapeProperties10.Append(customGeometry10); shapeProperties10.Append(solidFill10); Wps.ShapeStyle shapeStyle10 = new Wps.ShapeStyle(); A.LineReference lineReference10 = new A.LineReference() { Index = (UInt32Value)0U }; A.FillReference fillReference10 = new A.FillReference() { Index = (UInt32Value)0U }; A.EffectReference effectReference10 = new A.EffectReference() { Index = (UInt32Value)0U }; A.FontReference fontReference10 = new A.FontReference() { Index = A.FontCollectionIndexValues.Minor }; shapeStyle10.Append(lineReference10); shapeStyle10.Append(fillReference10); shapeStyle10.Append(effectReference10); shapeStyle10.Append(fontReference10); Wps.TextBodyProperties textBodyProperties10 = new Wps.TextBodyProperties(); wordprocessingShape10.Append(nonVisualDrawingProperties10); wordprocessingShape10.Append(nonVisualDrawingShapeProperties10); wordprocessingShape10.Append(shapeProperties10); wordprocessingShape10.Append(shapeStyle10); wordprocessingShape10.Append(textBodyProperties10); wordprocessingGroup1.Append(wordprocessingShape10); }
private Wp.Inline CreateInline(A.GraphicData graphicData, Wpg.WordprocessingGroup wordprocessingGroup1) { UInt32Value inlineId = UInt32Value.FromUInt32((uint)_ooxmlId++); Int64Value width = OoXmlHelper.ScaleCmlToEmu(_canvasExtents.Width); Int64Value height = OoXmlHelper.ScaleCmlToEmu(_canvasExtents.Height); Wp.Inline inline1 = new Wp.Inline() { DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U }; Wp.Extent extent1 = new Wp.Extent() { Cx = width, Cy = height }; Wp.EffectExtent effectExtent1 = new Wp.EffectExtent() { LeftEdge = 0L, TopEdge = 0L, RightEdge = 0L, BottomEdge = 0L }; Wp.DocProperties docProperties1 = new Wp.DocProperties() { Id = inlineId, Name = "moleculeGroup" }; Wpg.NonVisualGroupDrawingShapeProperties nonVisualGroupDrawingShapeProperties1 = new Wpg.NonVisualGroupDrawingShapeProperties(); Wpg.NonVisualGraphicFrameProperties nonVisualGraphicFrameProperties = new Wpg.NonVisualGraphicFrameProperties(); A.GraphicFrameLocks gfl = new A.GraphicFrameLocks() { NoMove = true, NoSelection = true }; Wpg.GroupShapeProperties groupShapeProperties1 = new Wpg.GroupShapeProperties(); A.TransformGroup transformGroup1 = new A.TransformGroup(); A.Offset offset1 = new A.Offset() { X = 0L, Y = 0L }; A.Extents extents1 = new A.Extents() { Cx = width, Cy = height }; A.ChildOffset childOffset1 = new A.ChildOffset() { X = 0L, Y = 0L }; A.ChildExtents childExtents1 = new A.ChildExtents() { Cx = width, Cy = height }; transformGroup1.Append(offset1); transformGroup1.Append(extents1); transformGroup1.Append(childOffset1); transformGroup1.Append(childExtents1); groupShapeProperties1.Append(transformGroup1); wordprocessingGroup1.Append(nonVisualGroupDrawingShapeProperties1); wordprocessingGroup1.Append(groupShapeProperties1); inline1.Append(extent1); inline1.Append(effectExtent1); inline1.Append(docProperties1); inline1.Append(gfl); return(inline1); }