From 954a0b2427bc149eabfab30f0da0aa87c1974931 Mon Sep 17 00:00:00 2001 From: DomCR Date: Fri, 23 Aug 2024 10:00:11 +0200 Subject: [PATCH 1/5] unknown Object --- src/ACadSharp/Entities/UnknownEntity.cs | 8 +-- src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs | 3 + .../DWG/DwgStreamReaders/DwgObjectReader.cs | 25 ++++++-- .../IO/Templates/CadUnknownEntityTemplate.cs | 6 ++ .../Objects/UnknownNonGraphicalObject.cs | 58 +++++++++++++++++++ 5 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 src/ACadSharp/Objects/UnknownNonGraphicalObject.cs diff --git a/src/ACadSharp/Entities/UnknownEntity.cs b/src/ACadSharp/Entities/UnknownEntity.cs index 65022e73..b078ba8b 100644 --- a/src/ACadSharp/Entities/UnknownEntity.cs +++ b/src/ACadSharp/Entities/UnknownEntity.cs @@ -4,10 +4,10 @@ namespace ACadSharp.Entities { /// - /// Class that holds the basic information for an unknown entity + /// Class that holds the basic information for an unknown . /// /// - /// Unknown entities may appear in the if the dwg file contains proxies or entities not yet supported by ACadSharp + /// Unknown entities may appear in the if the cad file contains proxies or entities not yet supported by ACadSharp. /// public class UnknownEntity : Entity { @@ -47,7 +47,7 @@ public override string SubclassMarker } /// - /// Dxf class linked to this entity + /// Dxf class linked to this entity. /// public DxfClass DxfClass { get; } @@ -62,7 +62,7 @@ internal UnknownEntity(DxfClass dxfClass) /// public override BoundingBox GetBoundingBox() { - return default; + return BoundingBox.Null; } } } diff --git a/src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs b/src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs index 18efe1a7..f8a6076d 100644 --- a/src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs +++ b/src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs @@ -1,5 +1,6 @@ using ACadSharp.Entities; using ACadSharp.IO.Templates; +using ACadSharp.Objects; using System.Collections.Generic; namespace ACadSharp.IO.DWG @@ -14,6 +15,8 @@ internal class DwgDocumentBuilder : CadDocumentBuilder public List UnknownEntities { get; } = new(); + public List UnknownNonGraphicalObjects { get; } = new(); + public List PaperSpaceEntities { get; } = new(); public List ModelSpaceEntities { get; } = new(); diff --git a/src/ACadSharp/IO/DWG/DwgStreamReaders/DwgObjectReader.cs b/src/ACadSharp/IO/DWG/DwgStreamReaders/DwgObjectReader.cs index 7f8b5966..730bf645 100644 --- a/src/ACadSharp/IO/DWG/DwgStreamReaders/DwgObjectReader.cs +++ b/src/ACadSharp/IO/DWG/DwgStreamReaders/DwgObjectReader.cs @@ -996,8 +996,6 @@ private CadTemplate readUnlistedType(short classNumber) case "LWPOLYLINE": template = this.readLWPolyline(); break; - case "MATERIAL": - break; case "MESH": template = this.readMesh(); break; @@ -1019,9 +1017,9 @@ private CadTemplate readUnlistedType(short classNumber) case "SORTENTSTABLE": template = this.readSortentsTable(); break; - case "VISUALSTYLE": - template = this.readVisualStyle(); - break; + //case "VISUALSTYLE": + // template = this.readVisualStyle(); + // break; case "WIPEOUT": template = this.readCadImage(new Wipeout()); break; @@ -1037,6 +1035,11 @@ private CadTemplate readUnlistedType(short classNumber) template = this.readUnknownEntity(c); this._builder.Notify($"Unlisted object with DXF name {c.DxfName} has been read as an UnknownEntity", NotificationType.Warning); } + else if (template == null && !c.IsAnEntity) + { + template = this.readUnknownNonGraphicalObject(c); + this._builder.Notify($"Unlisted object with DXF name {c.DxfName} has been read as an UnknownNonGraphicalObject", NotificationType.Warning); + } if (template == null) { @@ -1060,6 +1063,18 @@ private CadTemplate readUnknownEntity(DxfClass dxfClass) return template; } + private CadTemplate readUnknownNonGraphicalObject(DxfClass dxfClass) + { + UnknownNonGraphicalObject obj = new UnknownNonGraphicalObject(dxfClass); + CadUnknownNonGraphicalObjectTemplate template = new CadUnknownNonGraphicalObjectTemplate(obj); + + this._builder.UnknownNonGraphicalObjects.Add(obj); + + this.readCommonNonEntityData(template); + + return template; + } + private CadTemplate readText() { TextEntity text = new TextEntity(); diff --git a/src/ACadSharp/IO/Templates/CadUnknownEntityTemplate.cs b/src/ACadSharp/IO/Templates/CadUnknownEntityTemplate.cs index d38631ed..73971e08 100644 --- a/src/ACadSharp/IO/Templates/CadUnknownEntityTemplate.cs +++ b/src/ACadSharp/IO/Templates/CadUnknownEntityTemplate.cs @@ -1,7 +1,13 @@ using ACadSharp.Entities; +using ACadSharp.Objects; namespace ACadSharp.IO.Templates { + internal class CadUnknownNonGraphicalObjectTemplate : CadNonGraphicalObjectTemplate + { + public CadUnknownNonGraphicalObjectTemplate(UnknownNonGraphicalObject obj) : base(obj) { } + } + internal class CadUnknownEntityTemplate : CadEntityTemplate { public CadUnknownEntityTemplate(UnknownEntity entity) : base(entity) { } diff --git a/src/ACadSharp/Objects/UnknownNonGraphicalObject.cs b/src/ACadSharp/Objects/UnknownNonGraphicalObject.cs new file mode 100644 index 00000000..fcf3b25f --- /dev/null +++ b/src/ACadSharp/Objects/UnknownNonGraphicalObject.cs @@ -0,0 +1,58 @@ +using ACadSharp.Classes; + +namespace ACadSharp.Objects +{ + /// + /// Class that holds the basic information for an unknown . + /// + /// + /// Unknown entities may appear in the if the cad file contains proxies or objects not yet supported by ACadSharp. + /// + public class UnknownNonGraphicalObject : NonGraphicalObject + { + /// + public override ObjectType ObjectType => ObjectType.UNDEFINED; + + /// + public override string ObjectName + { + get + { + if (this.DxfClass == null) + { + return "UNKNOWN"; + } + else + { + return this.DxfClass.DxfName; + } + } + } + + /// + public override string SubclassMarker + { + get + { + if (this.DxfClass == null) + { + return DxfSubclassMarker.Entity; + } + else + { + return this.DxfClass.CppClassName; + } + } + } + + /// + /// Dxf class linked to this entity. + /// + public DxfClass DxfClass { get; } + + internal UnknownNonGraphicalObject(DxfClass dxfClass) + { + this.DxfClass = dxfClass; + } + } +} From 0a339948673a5fa7e99ff1e08b5ae21718cf868f Mon Sep 17 00:00:00 2001 From: DomCR Date: Sun, 25 Aug 2024 09:28:41 +0200 Subject: [PATCH 2/5] test fix --- src/ACadSharp.Tests/CadObjectTests.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ACadSharp.Tests/CadObjectTests.cs b/src/ACadSharp.Tests/CadObjectTests.cs index 06440833..baaa0a72 100644 --- a/src/ACadSharp.Tests/CadObjectTests.cs +++ b/src/ACadSharp.Tests/CadObjectTests.cs @@ -1,7 +1,6 @@ using System; using Xunit; using ACadSharp.Tests.Common; -using ACadSharp.Tables.Collections; using ACadSharp.Entities; namespace ACadSharp.Tests @@ -12,7 +11,7 @@ public class CadObjectTests static CadObjectTests() { - foreach (Type item in DataFactory.GetTypes()) + foreach (Type item in DataFactory.GetTypes()) { if (item == typeof(UnknownEntity)) { From ccbdc5ffbe8aa023f4220f797b9d1072c62b8faf Mon Sep 17 00:00:00 2001 From: DomCR Date: Sun, 25 Aug 2024 09:33:59 +0200 Subject: [PATCH 3/5] ignore UnknownNonGraphicalObject writers --- src/ACadSharp.Tests/CadObjectTests.cs | 19 +------------------ src/ACadSharp.Tests/Entities/EntityTests.cs | 17 +++++++++++++++++ .../DwgObjectWriter.Objects.cs | 1 + .../DxfObjectsSectionWriter.cs | 1 + 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/ACadSharp.Tests/CadObjectTests.cs b/src/ACadSharp.Tests/CadObjectTests.cs index baaa0a72..c0a1113a 100644 --- a/src/ACadSharp.Tests/CadObjectTests.cs +++ b/src/ACadSharp.Tests/CadObjectTests.cs @@ -11,7 +11,7 @@ public class CadObjectTests static CadObjectTests() { - foreach (Type item in DataFactory.GetTypes()) + foreach (Type item in DataFactory.GetTypes()) { if (item == typeof(UnknownEntity)) { @@ -27,23 +27,6 @@ static CadObjectTests() } } - [Theory] - [MemberData(nameof(ACadTypes))] - public void DefaultConstructor(Type t) - { - CadObject cadObject = Factory.CreateObject(t, false); - - Assert.NotNull(cadObject); - Assert.True(0 == cadObject.Handle); - - Assert.NotEqual(ObjectType.UNDEFINED, cadObject.ObjectType); - - Assert.False(string.IsNullOrEmpty(cadObject.ObjectName)); - Assert.False(string.IsNullOrEmpty(cadObject.SubclassMarker)); - - Assert.Null(cadObject.XDictionary); - } - [Fact] public void CreateExtendedDictionaryTest() { diff --git a/src/ACadSharp.Tests/Entities/EntityTests.cs b/src/ACadSharp.Tests/Entities/EntityTests.cs index bb2dd290..fc33e551 100644 --- a/src/ACadSharp.Tests/Entities/EntityTests.cs +++ b/src/ACadSharp.Tests/Entities/EntityTests.cs @@ -22,6 +22,23 @@ static EntityTests() } } + [Theory] + [MemberData(nameof(EntityTypes))] + public void DefaultConstructor(Type t) + { + CadObject cadObject = Factory.CreateObject(t, false); + + Assert.NotNull(cadObject); + Assert.True(0 == cadObject.Handle); + + Assert.NotEqual(ObjectType.UNDEFINED, cadObject.ObjectType); + + Assert.False(string.IsNullOrEmpty(cadObject.ObjectName)); + Assert.False(string.IsNullOrEmpty(cadObject.SubclassMarker)); + + Assert.Null(cadObject.XDictionary); + } + [Theory] [MemberData(nameof(EntityTypes))] public void BoundingBoxTest(Type entityType) diff --git a/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs b/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs index 1a9274a3..97fea9d5 100644 --- a/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs +++ b/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs @@ -28,6 +28,7 @@ private void writeObject(CadObject obj) case MultiLeaderAnnotContext: case MultiLeaderStyle: case SortEntitiesTable: + case UnknownNonGraphicalObject: case VisualStyle: this.notify($"Object type not implemented {obj.GetType().FullName}", NotificationType.NotImplemented); return; diff --git a/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs b/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs index fc1c80a8..5c88711e 100644 --- a/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs +++ b/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs @@ -35,6 +35,7 @@ protected void writeObject(T co) case MultiLeaderAnnotContext: case VisualStyle: case ImageDefinitionReactor: + case UnknownNonGraphicalObject: case XRecord: this.notify($"Object not implemented : {co.GetType().FullName}"); return; From e2828313655e660e5c42eb25c4af42d022ef0c30 Mon Sep 17 00:00:00 2001 From: DomCR Date: Sun, 25 Aug 2024 09:35:24 +0200 Subject: [PATCH 4/5] skip for dictionaries --- .../IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs b/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs index 97fea9d5..c36ac818 100644 --- a/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs +++ b/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs @@ -133,6 +133,11 @@ private void writeDictionary(CadDictionary dictionary) return; } + if (item is UnknownNonGraphicalObject) + { + return; + } + this._writer.WriteVariableText(item.Name); this._writer.HandleReference(DwgReferenceType.SoftOwnership, item.Handle); } From 361d376f538ba2e2051a4b04939cb3c2782e1b62 Mon Sep 17 00:00:00 2001 From: DomCR Date: Sun, 25 Aug 2024 10:10:11 +0200 Subject: [PATCH 5/5] added dxfreader feat --- src/ACadSharp.Tests/IO/DWG/DwgReaderTests.cs | 1 + src/ACadSharp.Tests/IO/DXF/DxfReaderTests.cs | 1 + src/ACadSharp/IO/CadDocumentBuilder.cs | 9 +++++++ src/ACadSharp/IO/CadReaderConfiguration.cs | 13 ++++++++-- src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs | 7 +++--- .../DWG/DwgStreamReaders/DwgObjectReader.cs | 4 --- src/ACadSharp/IO/DXF/DxfDocumentBuilder.cs | 2 ++ .../DxfObjectsSectionReader.cs | 25 +++++++++++++++++-- .../DxfStreamReader/DxfSectionReaderBase.cs | 9 +------ 9 files changed, 51 insertions(+), 20 deletions(-) diff --git a/src/ACadSharp.Tests/IO/DWG/DwgReaderTests.cs b/src/ACadSharp.Tests/IO/DWG/DwgReaderTests.cs index 280ea827..06de6dca 100644 --- a/src/ACadSharp.Tests/IO/DWG/DwgReaderTests.cs +++ b/src/ACadSharp.Tests/IO/DWG/DwgReaderTests.cs @@ -56,6 +56,7 @@ public override void AssertDocumentContent(FileModel test) public override void AssertDocumentTree(FileModel test) { DwgReaderConfiguration configuration = new DwgReaderConfiguration(); + configuration.KeepUnknownNonGraphicalObjects = true; configuration.KeepUnknownEntities = true; CadDocument doc = DwgReader.Read(test.Path, configuration); diff --git a/src/ACadSharp.Tests/IO/DXF/DxfReaderTests.cs b/src/ACadSharp.Tests/IO/DXF/DxfReaderTests.cs index 766a0406..0ce31e18 100644 --- a/src/ACadSharp.Tests/IO/DXF/DxfReaderTests.cs +++ b/src/ACadSharp.Tests/IO/DXF/DxfReaderTests.cs @@ -116,6 +116,7 @@ public override void AssertDocumentContent(FileModel test) public override void AssertDocumentTree(FileModel test) { DxfReaderConfiguration configuration = new DxfReaderConfiguration(); + configuration.KeepUnknownNonGraphicalObjects = true; configuration.KeepUnknownEntities = true; CadDocument doc; diff --git a/src/ACadSharp/IO/CadDocumentBuilder.cs b/src/ACadSharp/IO/CadDocumentBuilder.cs index 11a3d788..02a8c84b 100644 --- a/src/ACadSharp/IO/CadDocumentBuilder.cs +++ b/src/ACadSharp/IO/CadDocumentBuilder.cs @@ -1,5 +1,6 @@ using ACadSharp.Entities; using ACadSharp.IO.Templates; +using ACadSharp.Objects; using ACadSharp.Tables; using ACadSharp.Tables.Collections; using System; @@ -35,6 +36,8 @@ internal abstract class CadDocumentBuilder public abstract bool KeepUnknownEntities { get; } + public abstract bool KeepUnknownNonGraphicalObjects { get; } + public ulong InitialHandSeed { get; set; } = 0; protected Dictionary cadObjectsTemplates = new(); @@ -105,6 +108,12 @@ public bool TryGetCadObject(ulong? handle, out T value) where T : CadObject return false; } + if (obj is UnknownNonGraphicalObject && !this.KeepUnknownNonGraphicalObjects) + { + value = null; + return false; + } + if (obj is T) { value = (T)obj; diff --git a/src/ACadSharp/IO/CadReaderConfiguration.cs b/src/ACadSharp/IO/CadReaderConfiguration.cs index eaea2a22..401682d8 100644 --- a/src/ACadSharp/IO/CadReaderConfiguration.cs +++ b/src/ACadSharp/IO/CadReaderConfiguration.cs @@ -14,12 +14,21 @@ public abstract class CadReaderConfiguration public bool Failsafe { get; set; } = true; /// - /// The reader will try to read and add to the document all that are linked to a + /// The reader will try to read and add to the document all that are linked to a /// which may be a proxy or an entity that is not yet supported by ACadSharp, default value is set to false. /// /// - /// These entities do not contain any geometric information and will be ignored by the writers + /// These entities do not contain any geometric information and will be ignored by the writers. /// public bool KeepUnknownEntities { get; set; } = false; + + /// + /// The reader will try to read and add to the document all that are linked to a + /// which may be a proxy or an NonGraphicalObject that is not yet supported by ACadSharp, default value is set to false. + /// + /// + /// These NonGraphicalObjects do not contain any information and will be ignored by the writers. + /// + public bool KeepUnknownNonGraphicalObjects { get; set; } = false; } } diff --git a/src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs b/src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs index f8a6076d..0bfe5323 100644 --- a/src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs +++ b/src/ACadSharp/IO/DWG/DwgDocumentBuilder.cs @@ -1,6 +1,7 @@ using ACadSharp.Entities; using ACadSharp.IO.Templates; using ACadSharp.Objects; +using System; using System.Collections.Generic; namespace ACadSharp.IO.DWG @@ -13,16 +14,14 @@ internal class DwgDocumentBuilder : CadDocumentBuilder public List BlockRecordTemplates { get; set; } = new(); - public List UnknownEntities { get; } = new(); - - public List UnknownNonGraphicalObjects { get; } = new(); - public List PaperSpaceEntities { get; } = new(); public List ModelSpaceEntities { get; } = new(); public override bool KeepUnknownEntities => this.Configuration.KeepUnknownEntities; + public override bool KeepUnknownNonGraphicalObjects => this.Configuration.KeepUnknownNonGraphicalObjects; + public DwgDocumentBuilder(ACadVersion version, CadDocument document, DwgReaderConfiguration configuration) : base(version, document) { diff --git a/src/ACadSharp/IO/DWG/DwgStreamReaders/DwgObjectReader.cs b/src/ACadSharp/IO/DWG/DwgStreamReaders/DwgObjectReader.cs index f8fa7ae6..dac09e25 100644 --- a/src/ACadSharp/IO/DWG/DwgStreamReaders/DwgObjectReader.cs +++ b/src/ACadSharp/IO/DWG/DwgStreamReaders/DwgObjectReader.cs @@ -1066,8 +1066,6 @@ private CadTemplate readUnknownEntity(DxfClass dxfClass) UnknownEntity entity = new UnknownEntity(dxfClass); CadUnknownEntityTemplate template = new CadUnknownEntityTemplate(entity); - this._builder.UnknownEntities.Add(entity); - this.readCommonEntityData(template); return template; @@ -1078,8 +1076,6 @@ private CadTemplate readUnknownNonGraphicalObject(DxfClass dxfClass) UnknownNonGraphicalObject obj = new UnknownNonGraphicalObject(dxfClass); CadUnknownNonGraphicalObjectTemplate template = new CadUnknownNonGraphicalObjectTemplate(obj); - this._builder.UnknownNonGraphicalObjects.Add(obj); - this.readCommonNonEntityData(template); return template; diff --git a/src/ACadSharp/IO/DXF/DxfDocumentBuilder.cs b/src/ACadSharp/IO/DXF/DxfDocumentBuilder.cs index 67aa54a3..431d95dc 100644 --- a/src/ACadSharp/IO/DXF/DxfDocumentBuilder.cs +++ b/src/ACadSharp/IO/DXF/DxfDocumentBuilder.cs @@ -17,6 +17,8 @@ internal class DxfDocumentBuilder : CadDocumentBuilder public override bool KeepUnknownEntities => this.Configuration.KeepUnknownEntities; + public override bool KeepUnknownNonGraphicalObjects => this.Configuration.KeepUnknownNonGraphicalObjects; + public DxfDocumentBuilder(ACadVersion version, CadDocument document, DxfReaderConfiguration configuration) : base(version, document) { this.Configuration = configuration; diff --git a/src/ACadSharp/IO/DXF/DxfStreamReader/DxfObjectsSectionReader.cs b/src/ACadSharp/IO/DXF/DxfStreamReader/DxfObjectsSectionReader.cs index 2bd588df..f261d9c2 100644 --- a/src/ACadSharp/IO/DXF/DxfStreamReader/DxfObjectsSectionReader.cs +++ b/src/ACadSharp/IO/DXF/DxfStreamReader/DxfObjectsSectionReader.cs @@ -70,13 +70,34 @@ private CadTemplate readObject() case DxfFileToken.ObjectXRecord: return this.readObjectCodes(new CadXRecordTemplate(), this.readXRecord); default: - this._builder.Notify($"Object not implemented: {this._reader.ValueAsString}", NotificationType.NotImplemented); + DxfMap map = DxfMap.Create(); + CadUnknownNonGraphicalObjectTemplate unknownEntityTemplate = null; + if (this._builder.DocumentToBuild.Classes.TryGetByName(this._reader.ValueAsString, out Classes.DxfClass dxfClass)) + { + this._builder.Notify($"NonGraphicalObject not supported read as an UnknownNonGraphicalObject: {this._reader.ValueAsString}", NotificationType.NotImplemented); + unknownEntityTemplate = new CadUnknownNonGraphicalObjectTemplate(new UnknownNonGraphicalObject(dxfClass)); + } + else + { + this._builder.Notify($"UnknownNonGraphicalObject not supported: {this._reader.ValueAsString}", NotificationType.NotImplemented); + } + + this._reader.ReadNext(); + do { + if (unknownEntityTemplate != null && this._builder.KeepUnknownEntities) + { + this.readCommonCodes(unknownEntityTemplate, out bool isExtendedData, map); + if (isExtendedData) + continue; + } + this._reader.ReadNext(); } while (this._reader.DxfCode != DxfCode.Start); - return null; + + return unknownEntityTemplate; } } diff --git a/src/ACadSharp/IO/DXF/DxfStreamReader/DxfSectionReaderBase.cs b/src/ACadSharp/IO/DXF/DxfStreamReader/DxfSectionReaderBase.cs index b6748803..26030894 100644 --- a/src/ACadSharp/IO/DXF/DxfStreamReader/DxfSectionReaderBase.cs +++ b/src/ACadSharp/IO/DXF/DxfStreamReader/DxfSectionReaderBase.cs @@ -224,14 +224,7 @@ protected CadEntityTemplate readEntity() } while (this._reader.DxfCode != DxfCode.Start); - if (this._builder.Configuration.KeepUnknownEntities) - { - return unknownEntityTemplate; - } - else - { - return null; - } + return unknownEntityTemplate; } }