/// <summary> /// Creates an <paramref name="affine"/> transform for DXF to PDF coordinate transformation and /// a <paramref name="scale"/> transform for relative values like radii. /// </summary> /// <param name="viewPort">The DXF view port.</param> /// <param name="options">The converter options.</param> /// <param name="scale">[out] The (relative) scale transform.</param> /// <param name="affine">[out] The (absolute) affine transform including scale.</param> private static void CreateTransformations(DxfViewPort viewPort, DxfToPdfConverterOptions options, out Matrix4 scale, out Matrix4 affine) { if (options.DxfSource != null && options.PdfDestination != null) { // user supplied source and destination rectangles, no trouble with units var dxfSource = options.DxfSource.GetValueOrDefault(); double pdfOffsetX = options.PdfDestination.Left.AsPoints(); double pdfOffsetY = options.PdfDestination.Bottom.AsPoints(); double scaleX = options.PdfDestination.Width.AsPoints() / dxfSource.Width; double scaleY = options.PdfDestination.Height.AsPoints() / dxfSource.Height; double dxfOffsetX = dxfSource.Left; double dxfOffsetY = dxfSource.Bottom; scale = Matrix4.CreateScale(scaleX, scaleY, 0.0); affine = Matrix4.CreateTranslate(+pdfOffsetX, +pdfOffsetY, 0.0) * scale * Matrix4.CreateTranslate(-dxfOffsetX, -dxfOffsetY, 0.0); return; } // TODO this code assumes DXF unit inch - use actual unit from header instead! // scale depends on the unit, output "pdf points" with 72 DPI const double dotsPerInch = 72; scale = Matrix4.CreateScale(options.Scale * dotsPerInch, options.Scale * dotsPerInch, 0.0); affine = Matrix4.Identity * scale * Matrix4.CreateTranslate(-viewPort.LowerLeft.X, -viewPort.LowerLeft.Y, 0.0); }
internal static DxfTable ReadFromBuffer(DxfCodePairBufferReader buffer) { var table = new DxfViewPortTable(); table.Items.Clear(); while (buffer.ItemsRemain) { var pair = buffer.Peek(); buffer.Advance(); if (DxfTablesSection.IsTableEnd(pair)) { break; } if (pair.Code == 0 && pair.StringValue == DxfTable.ViewPortText) { var item = DxfViewPort.FromBuffer(buffer); table.Items.Add(item); } } return(table); }
internal static DxfViewPort FromBuffer(DxfCodePairBufferReader buffer) { var item = new DxfViewPort(); while (buffer.ItemsRemain) { var pair = buffer.Peek(); if (pair.Code == 0) { break; } buffer.Advance(); switch (pair.Code) { case 70: item.StandardFlags = (int)pair.ShortValue; break; case DxfCodePairGroup.GroupCodeNumber: var groupName = DxfCodePairGroup.GetGroupName(pair.StringValue); item.ExtensionDataGroups.Add(DxfCodePairGroup.FromBuffer(buffer, groupName)); break; case 10: item.LowerLeft.X = (pair.DoubleValue); break; case 20: item.LowerLeft.Y = (pair.DoubleValue); break; case 11: item.UpperRight.X = (pair.DoubleValue); break; case 21: item.UpperRight.Y = (pair.DoubleValue); break; case 12: item.ViewCenter.X = (pair.DoubleValue); break; case 22: item.ViewCenter.Y = (pair.DoubleValue); break; case 13: item.SnapBasePoint.X = (pair.DoubleValue); break; case 23: item.SnapBasePoint.Y = (pair.DoubleValue); break; case 14: item.SnapSpacing.X = (pair.DoubleValue); break; case 24: item.SnapSpacing.Y = (pair.DoubleValue); break; case 15: item.GridSpacing.X = (pair.DoubleValue); break; case 25: item.GridSpacing.Y = (pair.DoubleValue); break; case 16: item.ViewDirection.X = (pair.DoubleValue); break; case 26: item.ViewDirection.Y = (pair.DoubleValue); break; case 36: item.ViewDirection.Z = (pair.DoubleValue); break; case 17: item.TargetViewPoint.X = (pair.DoubleValue); break; case 27: item.TargetViewPoint.Y = (pair.DoubleValue); break; case 37: item.TargetViewPoint.Z = (pair.DoubleValue); break; case 40: item.ViewHeight = (pair.DoubleValue); break; case 41: item.ViewPortAspectRatio = (pair.DoubleValue); break; case 42: item.LensLength = (pair.DoubleValue); break; case 43: item.FrontClippingPlane = (pair.DoubleValue); break; case 44: item.BackClippingPlane = (pair.DoubleValue); break; case 45: item.ViewHeight = (pair.DoubleValue); break; case 50: item.SnapRotationAngle = (pair.DoubleValue); break; case 51: item.ViewTwistAngle = (pair.DoubleValue); break; case 68: item.Status = (pair.ShortValue); break; case 69: item.ID = (pair.ShortValue); break; case 71: item.ViewMode = (DxfViewMode)(pair.ShortValue); break; case 72: item.CircleZoomPercent = (int)(pair.ShortValue); break; case 73: item.FastZoom = BoolShort(pair.ShortValue); break; case 74: item.UCSIcon = BoolShort(pair.ShortValue); break; case 75: item.SnapOn = BoolShort(pair.ShortValue); break; case 76: item.GridOn = BoolShort(pair.ShortValue); break; case 77: item.SnapStyle = (pair.ShortValue); break; case 78: item.SnapIsoPair = (pair.ShortValue); break; case 1: item.PlotStyleSheet = (pair.StringValue); break; case 281: item.RenderMode = (DxfViewRenderMode)(pair.ShortValue); break; case 65: item.HasOwnUCS = BoolShort(pair.ShortValue); break; case 110: item.UCSOrigin.X = (pair.DoubleValue); break; case 120: item.UCSOrigin.Y = (pair.DoubleValue); break; case 130: item.UCSOrigin.Z = (pair.DoubleValue); break; case 111: item.UCSXAxis.X = (pair.DoubleValue); break; case 121: item.UCSXAxis.Y = (pair.DoubleValue); break; case 131: item.UCSXAxis.Z = (pair.DoubleValue); break; case 112: item.UCSYAxis.X = (pair.DoubleValue); break; case 122: item.UCSYAxis.Y = (pair.DoubleValue); break; case 132: item.UCSYAxis.Z = (pair.DoubleValue); break; case 79: item.OrthographicViewType = (DxfOrthographicViewType)(pair.ShortValue); break; case 146: item.UCSElevation = (pair.DoubleValue); break; case 345: item.UCSHandle = UIntHandle(pair.StringValue); break; case 346: item.BaseUCSHandle = UIntHandle(pair.StringValue); break; case 170: item.ShadePlotSetting = (DxfShadeEdgeMode)(pair.ShortValue); break; case 61: item.MajorGridLines = BoolShort(pair.ShortValue); break; case 332: item.BackgroundObjectPointer = UIntHandle(pair.StringValue); break; case 333: item.ShadePlotObjectPointer = UIntHandle(pair.StringValue); break; case 348: item.VisualStyleObjectPointer = UIntHandle(pair.StringValue); break; case 292: item.IsDefaultLightingOn = (pair.BoolValue); break; case 282: item.DefaultLightingType = (DxfDefaultLightingType)(pair.ShortValue); break; case 141: item.Brightness = (pair.DoubleValue); break; case 142: item.Contrast = (pair.DoubleValue); break; case 62: item.AmbientColor = DxfColor.FromRawValue(pair.ShortValue); break; case 421: item.AmbientColorInt = (pair.IntegerValue); break; case 431: item.AmbientColorName = (pair.StringValue); break; case (int)DxfXDataType.ApplicationName: item.XData = DxfXData.FromBuffer(buffer, pair.StringValue); break; default: item.TrySetPair(pair); break; } } return item; }