示例#1
0
 private DxfFile RoundTripFileThroughODA(DxfFile file)
 {
     using (var input = new ManageTemporaryDirectory())
         using (var output = new ManageTemporaryDirectory())
         {
             file.Save(Path.Combine(input.DirectoryPath, "drawing.dxf"));
             AssertODAConvert(input.DirectoryPath, output.DirectoryPath, file.Header.Version);
             var result = DxfFile.Load(Path.Combine(output.DirectoryPath, "drawing.dxf"));
             return(result);
         }
 }
示例#2
0
        public void WritingEmptyBlockR2000Test()
        {
            var file = new DxfFile();

            file.Header.Version = DxfAcadVersion.R2000;
            file.Blocks.Add(new DxfBlock());
            file.Blocks.Add(SetAllPropertiesToDefault(new DxfBlock()));
            file.Blocks.Add(null);
            using (var ms = new MemoryStream())
            {
                file.Save(ms);
            }
        }
示例#3
0
        public void DontWriteBomTest()
        {
            using (var stream = new MemoryStream())
            {
                var file = new DxfFile();
                file.Save(stream);
                stream.Seek(0, SeekOrigin.Begin);
                var buffer = new byte[3];
                stream.Read(buffer, 0, buffer.Length);

                // first three bytes should be "  0", not 0xEF, 0xBB, 0xBF
                Assert.Equal(new byte[] { (byte)' ', (byte)' ', (byte)'0' }, buffer);
            }
        }
示例#4
0
        public void WriteTablesWithDefaultValuesTest()
        {
            var file = new DxfFile();

            file.ApplicationIds.Add(new DxfAppId());
            file.ApplicationIds.Add(SetAllPropertiesToDefault(new DxfAppId()));
            file.ApplicationIds.Add(null);

            file.BlockRecords.Add(new DxfBlockRecord());
            file.BlockRecords.Add(SetAllPropertiesToDefault(new DxfBlockRecord()));
            file.BlockRecords.Add(null);

            file.DimensionStyles.Add(new DxfDimStyle());
            file.DimensionStyles.Add(SetAllPropertiesToDefault(new DxfDimStyle()));
            file.DimensionStyles.Add(null);

            file.Layers.Add(new DxfLayer());
            file.Layers.Add(SetAllPropertiesToDefault(new DxfLayer()));
            file.Layers.Add(null);

            file.Linetypes.Add(new DxfLineType());
            file.Linetypes.Add(SetAllPropertiesToDefault(new DxfLineType()));
            file.Linetypes.Add(null);

            file.Styles.Add(new DxfStyle());
            file.Styles.Add(SetAllPropertiesToDefault(new DxfStyle()));
            file.Styles.Add(null);

            file.UserCoordinateSystems.Add(new DxfUcs());
            file.UserCoordinateSystems.Add(SetAllPropertiesToDefault(new DxfUcs()));
            file.UserCoordinateSystems.Add(null);

            file.Views.Add(new DxfView());
            file.Views.Add(SetAllPropertiesToDefault(new DxfView()));
            file.Views.Add(null);

            file.ViewPorts.Add(new DxfViewPort());
            file.ViewPorts.Add(SetAllPropertiesToDefault(new DxfViewPort()));
            file.ViewPorts.Add(null);

            using (var ms = new MemoryStream())
            {
                file.Save(ms);
            }
        }
示例#5
0
        public void VerifyTableItemsReportTableAsOwner()
        {
            var file = new DxfFile();
            var view = new DxfView();

            file.Views.Add(view);
            using (var ms = new MemoryStream())
            {
                file.Save(ms); // not needed, but it forces pointers to bind
            }

            // check pointer values
            Assert.NotEqual(0u, view.OwnerHandle);
            Assert.Equal(view.OwnerHandle, file.TablesSection.ViewTable.Handle);

            // check object values
            Assert.True(ReferenceEquals(view.Owner, file.TablesSection.ViewTable));
        }
示例#6
0
        public void AutoCadReadAllEntitiesTest()
        {
            // TODO: make these work with AutoCAD
            var unsupportedTypes = new[]
            {
                // unsupported because I need to write more information with them
                typeof(DxfInsert), // need a block to insert
                typeof(DxfLeader), // needs vertices
                typeof(DxfMLine), // need to set MLINESTYLE and MLINESTYLE dictionary
                typeof(DxfDgnUnderlay), // AcDbUnderlayDefinition object ID must be set
                typeof(DxfDwfUnderlay), // AcDbUnderlayDefinition object ID must be set
                typeof(DxfPdfUnderlay), // AcDbUnderlayDefinition object ID must be set
                typeof(DxfSpline), // need to supply control/fit points
                typeof(DxfVertex), // can't write a lone vertex?

                // unsupported for other reasons TBD
                typeof(Dxf3DSolid),
                typeof(DxfAttribute),
                typeof(DxfAttributeDefinition),
                typeof(DxfBody),
                typeof(DxfHelix), // acad expects AcDbSpline?
                typeof(DxfLight),
                typeof(DxfMText),
                typeof(DxfRegion),
                typeof(DxfProxyEntity),
                typeof(DxfShape),
                typeof(DxfTolerance),
            };

            // create a file with all entities and ensure AutoCAD can read it
            var file = new DxfFile();
            file.Header.Version = DxfAcadVersion.R2010;
            var assembly = typeof(DxfFile).Assembly;
            foreach (var type in assembly.GetTypes())
            {
                if (DxfReaderWriterTests.IsEntityOrDerived(type) && type.BaseType != typeof(DxfDimensionBase) && !unsupportedTypes.Contains(type))
                {
                    var ctor = type.GetConstructor(Type.EmptyTypes);
                    if (ctor != null)
                    {
                        // add the entity with its default initialized values
                        var entity = (DxfEntity)ctor.Invoke(new object[0]);
                        file.Entities.Add(entity);

                        if (entity is DxfText)
                        {
                            // set an explicit value to ensure that it could be round-tripped
                            ((DxfText)entity).Value = "sample text";
                        }
                    }
                }
            }

            using (var directory = new ManageTemporaryDirectory())
            {
                var sampleFilePath = Path.Combine(directory.DirectoryPath, "file.dxf");
                using (var fs = new FileStream(sampleFilePath, FileMode.Create))
                {
                    file.Save(fs);
                }

                var scriptFilePath = Path.Combine(directory.DirectoryPath, "script.scr");
                var outputFilePath = Path.Combine(directory.DirectoryPath, "result.dxf");
                File.WriteAllLines(scriptFilePath, new[]
                {
                    "FILEDIA 0",
                    $"DXFIN \"{sampleFilePath}\"",
                    $"DXFOUT \"{outputFilePath}\" 16",
                    "FILEDIA 1",
                    "QUIT Y"
                });
                ExecuteAutoCadScript(scriptFilePath);

                // read file back in and confirm DxfText value
                DxfFile resultFile;
                using (var fs = new FileStream(outputFilePath, FileMode.Open))
                {
                    resultFile = DxfFile.Load(fs);
                }

                var text = resultFile.Entities.OfType<DxfText>().Single();
                Assert.Equal("sample text", text.Value);
            }
        }
示例#7
0
        public void TeighaReadAllObjectsTest()
        {
            // create a file with all objects and ensure Teigha can read it
            var file = new DxfFile();
            file.Header.Version = DxfAcadVersion.R2013;
            var assembly = typeof(DxfFile).Assembly;
            foreach (var type in assembly.GetTypes())
            {
                if (DxfReaderWriterTests.IsObjectOrDerived(type))
                {
                    var ctor = type.GetConstructor(Type.EmptyTypes);
                    if (ctor != null)
                    {
                        // add the object with its default initialized values
                        var obj = (DxfObject)ctor.Invoke(new object[0]);
                        file.Objects.Add(obj);
                    }
                }
            }

            using (var input = new ManageTemporaryDirectory())
            using (var output = new ManageTemporaryDirectory())
            {
                var inputFile = Path.Combine(input.DirectoryPath, "file.dxf");
                using (var fs = new FileStream(inputFile, FileMode.Create))
                {
                    file.Save(fs);
                }

                AssertTeighaConvert(input.DirectoryPath, output.DirectoryPath, DxfAcadVersion.R2013);
            }
        }
示例#8
0
        public void AutoCadReadIxMiliaFileCompatTest()
        {
            // save a DXF file in all the formats that IxMilia.Dxf and AutoCAD support and try to get AutoCAD to read all of them
            using (var directory = new ManageTemporaryDirectory())
            {
                var tempDir = directory.DirectoryPath;
                var versions = new[]
                {
                    DxfAcadVersion.R9,
                    DxfAcadVersion.R10,
                    DxfAcadVersion.R11,
                    DxfAcadVersion.R12,
                    //DxfAcadVersion.R13,
                    DxfAcadVersion.R14,
                    DxfAcadVersion.R2000,
                    DxfAcadVersion.R2004,
                    DxfAcadVersion.R2007,
                    DxfAcadVersion.R2010,
                    DxfAcadVersion.R2013
                };

                // save the minimal file with all versions
                var file = new DxfFile();
                var text = new DxfText(DxfPoint.Origin, 2.0, "");
                file.Entities.Add(text);
                foreach (var version in versions)
                {
                    var fileName = $"file.{version}.dxf";
                    file.Header.Version = version;
                    text.Value = version.ToString();
                    var outputPath = Path.Combine(tempDir, fileName);
                    using (var fs = new FileStream(outputPath, FileMode.Create))
                    {
                        file.Save(fs);
                    }
                }

                // open each file in AutoCAD and try to write it back out
                var lines = new List<string>();
                lines.Add("FILEDIA 0");
                foreach (var version in versions)
                {
                    lines.Add("ERASE ALL ");
                    lines.Add($"DXFIN \"{Path.Combine(tempDir, $"file.{version}.dxf")}\"");
                    lines.Add($"DXFOUT \"{Path.Combine(tempDir, $"result.{version}.dxf")}\" V R12 16");
                }

                lines.Add("FILEDIA 1");
                lines.Add("QUIT Y");

                // create and execute the script
                var scriptPath = Path.Combine(tempDir, "script.scr");
                File.WriteAllLines(scriptPath, lines);

                ExecuteAutoCadScript(scriptPath);

                // check each resultant file for the correct version and text
                foreach (var version in versions)
                {
                    DxfFile dxf;
                    using (var fs = new FileStream(Path.Combine(tempDir, $"result.{version}.dxf"), FileMode.Open))
                    {
                        dxf = DxfFile.Load(fs);
                    }

                    Assert.Equal(version.ToString(), ((DxfText)dxf.Entities.Single()).Value);
                }
            }
        }
示例#9
0
 private static void EnsureFileContainsEntity(DxfEntity entity, string text)
 {
     var file = new DxfFile();
     file.Entities.Add(entity);
     using (var stream = new MemoryStream())
     {
         file.Save(stream);
         stream.Flush();
         stream.Seek(0, SeekOrigin.Begin);
         using (var reader = new StreamReader(stream))
         {
             var actual = reader.ReadToEnd();
             Assert.Contains(text.Trim(), actual);
         }
     }
 }
示例#10
0
        public void WriteTablesWithDefaultValuesTest()
        {
            var file = new DxfFile();

            file.ApplicationIds.Add(new DxfAppId());
            file.ApplicationIds.Add(SetAllPropertiesToDefault(new DxfAppId()));
            file.ApplicationIds.Add(null);

            file.BlockRecords.Add(new DxfBlockRecord());
            file.BlockRecords.Add(SetAllPropertiesToDefault(new DxfBlockRecord()));
            file.BlockRecords.Add(null);

            file.DimensionStyles.Add(new DxfDimStyle());
            file.DimensionStyles.Add(SetAllPropertiesToDefault(new DxfDimStyle()));
            file.DimensionStyles.Add(null);

            file.Layers.Add(new DxfLayer());
            file.Layers.Add(SetAllPropertiesToDefault(new DxfLayer()));
            file.Layers.Add(null);

            file.Linetypes.Add(new DxfLineType());
            file.Linetypes.Add(SetAllPropertiesToDefault(new DxfLineType()));
            file.Linetypes.Add(null);

            file.Styles.Add(new DxfStyle());
            file.Styles.Add(SetAllPropertiesToDefault(new DxfStyle()));
            file.Styles.Add(null);

            file.UserCoordinateSystems.Add(new DxfUcs());
            file.UserCoordinateSystems.Add(SetAllPropertiesToDefault(new DxfUcs()));
            file.UserCoordinateSystems.Add(null);

            file.Views.Add(new DxfView());
            file.Views.Add(SetAllPropertiesToDefault(new DxfView()));
            file.Views.Add(null);

            file.ViewPorts.Add(new DxfViewPort());
            file.ViewPorts.Add(SetAllPropertiesToDefault(new DxfViewPort()));
            file.ViewPorts.Add(null);

            using (var ms = new MemoryStream())
            {
                file.Save(ms);
            }
        }
示例#11
0
        public void WriteAllDefaultEntitiesTest()
        {
            var file = new DxfFile();
            var assembly = typeof(DxfFile).Assembly;
            foreach (var type in assembly.GetTypes())
            {
                if (IsEntityOrDerived(type))
                {
                    var ctor = type.GetConstructor(Type.EmptyTypes);
                    if (ctor != null)
                    {
                        // add the entity with its default initialized values
                        var entity = (DxfEntity)ctor.Invoke(new object[0]);
                        file.Entities.Add(entity);

                        // add the entity with its default values and 2 items added to each List<T> collection
                        entity = (DxfEntity)ctor.Invoke(new object[0]);
                        foreach (var property in type.GetProperties().Where(p => IsListOfT(p.PropertyType)))
                        {
                            var itemType = property.PropertyType.GenericTypeArguments.Single();
                            var itemValue = itemType.IsValueType
                                ? Activator.CreateInstance(itemType)
                                : null;
                            var addMethod = property.PropertyType.GetMethod("Add");
                            var propertyValue = property.GetValue(entity);
                            addMethod.Invoke(propertyValue, new object[] { itemValue });
                            addMethod.Invoke(propertyValue, new object[] { itemValue });
                        }

                        // add an entity with all non-indexer properties set to `default(T)`
                        entity = (DxfEntity)SetAllPropertiesToDefault(ctor.Invoke(new object[0]));
                        file.Entities.Add(entity);
                    }
                }
            }

            // write each version of the entities with default versions
            foreach (var version in new[] { DxfAcadVersion.R10, DxfAcadVersion.R11, DxfAcadVersion.R12, DxfAcadVersion.R13, DxfAcadVersion.R14, DxfAcadVersion.R2000, DxfAcadVersion.R2004, DxfAcadVersion.R2007, DxfAcadVersion.R2010, DxfAcadVersion.R2013 })
            {
                file.Header.Version = version;
                using (var ms = new MemoryStream())
                {
                    file.Save(ms);
                }
            }
        }
示例#12
0
        public void WriteLayoutTest()
        {
            var layout = new DxfLayout();
            layout.PageSetupName = "page-setup-name";
            layout.LayoutName = "layout-name";
            var file = new DxfFile();
            file.Objects.Add(layout);
            using (var ms = new MemoryStream())
            {
                file.Save(ms);
                ms.Seek(0, SeekOrigin.Begin);
                using (var reader = new StreamReader(ms))
                {
                    var contents = reader.ReadToEnd();

                    // verify the plot settings were written
                    var plotSettingsOffset = contents.IndexOf(@"
            100
            AcDbPlotSettings
              1
            page-setup-name
            ".Trim());
                    Assert.True(plotSettingsOffset > 0);

                    // verify the layout settings were written
                    var layoutOffset = contents.IndexOf(@"
            100
            AcDbLayout
              1
            layout-name
            ".Trim());
                    Assert.True(layoutOffset > 0);

                    // verify that the layout settings were written after the plot settings
                    Assert.True(layoutOffset > plotSettingsOffset);
                }
            }
        }
示例#13
0
        public void WriteAndReadTypeDefaultsTest()
        {
            var file = new DxfFile();
            SetAllPropertiesToDefault(file.Header);

            // write each version of the header with default values
            foreach (var version in new[] { DxfAcadVersion.R10, DxfAcadVersion.R11, DxfAcadVersion.R12, DxfAcadVersion.R13, DxfAcadVersion.R14, DxfAcadVersion.R2000, DxfAcadVersion.R2004, DxfAcadVersion.R2007, DxfAcadVersion.R2010, DxfAcadVersion.R2013 })
            {
                file.Header.Version = version;
                using (var ms = new MemoryStream())
                {
                    file.Save(ms);
                    ms.Flush();
                    ms.Seek(0, SeekOrigin.Begin);

                    // ensure the header can be read back in, too
                    var file2 = DxfFile.Load(ms);
                }
            }
        }
示例#14
0
    private IEnumerator CreateFile(Bounds UnityBounds, List <Layer> layerList)
    {
        FreezeLayers(layerList, true);
        Debug.Log(layerList.Count);
        Vector3RD bottomLeftRD = CoordConvert.UnitytoRD(UnityBounds.min);
        Vector3RD topRightRD   = CoordConvert.UnitytoRD(UnityBounds.max);

        boundingbox = new MeshClipper.RDBoundingBox(bottomLeftRD.x, bottomLeftRD.y, topRightRD.x, topRightRD.y);
        DxfFile dxfFile = new DxfFile();

        dxfFile.SetupDXF();
        yield return(null);

        MeshClipper meshClipper = new MeshClipper();

        loadingScreen.ShowMessage("DXF-bestand genereren...");
        loadingScreen.ProgressBar.SetMessage("");
        loadingScreen.ProgressBar.Percentage(0.1f);
        yield return(new WaitForEndOfFrame());

        int layercounter = 0;

        foreach (var layer in layerList)
        {
            layercounter++;
            loadingScreen.ProgressBar.Percentage((float)layercounter / ((float)layerList.Count + 1));
            loadingScreen.ProgressBar.SetMessage("Laag '" + layer.name + "' wordt omgezet...");
            yield return(new WaitForEndOfFrame());

            List <GameObject> gameObjectsToClip = GetTilesInLayer(layer, bottomLeftRD, topRightRD);
            if (gameObjectsToClip.Count == 0)
            {
                continue;
            }
            foreach (var gameObject in gameObjectsToClip)
            {
                meshClipper.SetGameObject(gameObject);
                for (int submeshID = 0; submeshID < gameObject.GetComponent <MeshFilter>().sharedMesh.subMeshCount; submeshID++)
                {
                    string layerName = gameObject.GetComponent <MeshRenderer>().sharedMaterials[submeshID].name.Replace(" (Instance)", "");
                    loadingScreen.ProgressBar.SetMessage("Laag '" + layer.name + "' object " + layerName + " wordt uitgesneden...");
                    yield return(new WaitForEndOfFrame());

                    meshClipper.ClipSubMesh(boundingbox, submeshID);
                    dxfFile.AddLayer(meshClipper.clippedVerticesRD, layerName, GetColor(gameObject.GetComponent <MeshRenderer>().sharedMaterials[submeshID]));
                    yield return(new WaitForEndOfFrame());
                }
                yield return(new WaitForEndOfFrame());
            }
            yield return(new WaitForEndOfFrame());
        }

        loadingScreen.ProgressBar.Percentage((float)layerList.Count / ((float)layerList.Count + 1));
        loadingScreen.ProgressBar.SetMessage("Het AutoCAD DXF (.dxf) bestand wordt afgerond...");
        yield return(new WaitForEndOfFrame());

        dxfFile.Save();

        loadingScreen.Hide();
        FreezeLayers(layerList, false);
        Debug.Log("file saved");
    }
示例#15
0
 public void WritingEmptyBlockR2000Test()
 {
     var file = new DxfFile();
     file.Header.Version = DxfAcadVersion.R2000;
     file.Blocks.Add(new DxfBlock());
     using (var ms = new MemoryStream())
     {
         file.Save(ms);
     }
 }
示例#16
0
 public void WritingPartiallyInitializedTablesTest()
 {
     var file = new DxfFile();
     file.ApplicationIds.Add(new DxfAppId());
     file.BlockRecords.Add(new DxfBlockRecord());
     file.DimensionStyles.Add(new DxfDimStyle());
     file.Layers.Add(new DxfLayer());
     file.Linetypes.Add(new DxfLineType());
     file.Styles.Add(new DxfStyle());
     file.UserCoordinateSystems.Add(new DxfUcs());
     file.Views.Add(new DxfView());
     file.ViewPorts.Add(new DxfViewPort());
     using (var ms = new MemoryStream())
     {
         file.Save(ms);
     }
 }
示例#17
0
        public void WriteSunStudyTest()
        {
            var sun = new DxfSunStudy();
            sun.Hours.Add(42);
            sun.Hours.Add(43);
            sun.Hours.Add(44);
            var file = new DxfFile();
            file.Objects.Add(sun);
            VerifyFileContains(file, @"
              0
            SUNSTUDY
              5
            A
            100
            AcDbSunStudy
             90
            0
              1

              2

             70
            0
              3

            290
            0
              4

            291
            0
             91
            0
            292
            0
             73
            3
            290
            42
            290
            43
            290
            44
            340
            0
            341
            0
            342
            0
             74
            0
             75
            0
             76
            0
             77
            0
             40
            0.0
            293
            0
            294
            0
            343
            0
            ");

            // verify writing as binary doesn't crash
            using (var ms = new MemoryStream())
            {
                file.Save(ms, asText: false);
            }
        }