From d80fea95f7ba1e2c72ea1bf67622ba74192fb1d3 Mon Sep 17 00:00:00 2001 From: DomCR Date: Mon, 9 Mar 2026 17:35:38 +0100 Subject: [PATCH 1/3] Add DXF support for BlockReferenceObjectContextData Implement writing of BlockReferenceObjectContextData in DxfObjectsSectionWriter, including annotation scale and transformation properties. Remove "not implemented" handling for this object type. Update DWG writer to align handling of BlockReferenceObjectContextData. --- .../DwgObjectWriter.Objects.cs | 1 - .../DxfObjectsSectionWriter.cs | 26 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs b/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs index 38d2be74e..25e93125f 100644 --- a/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs +++ b/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs @@ -45,7 +45,6 @@ private bool skipEntry(NonGraphicalObject entry, out bool notify) case TableStyle: case ProxyObject: case BlockRepresentationData: - case BlockReferenceObjectContextData: case MTextAttributeObjectContextData: return true; } diff --git a/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs b/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs index a3da4ff6e..5dec50b83 100644 --- a/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs +++ b/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs @@ -380,6 +380,9 @@ protected void writeObject(T co) case AcdbPlaceHolder acdbPlaceHolder: this.writeAcdbPlaceHolder(acdbPlaceHolder); return; + case BlockReferenceObjectContextData blockContextData: + this.writeBlockReferenceObjectContextData(blockContextData); + return; case BookColor bookColor: this.writeBookColor(bookColor); return; @@ -588,7 +591,6 @@ private bool isObjectSupported(CadObject co) case ProxyObject: case BlockRepresentationData: case MTextAttributeObjectContextData: - case BlockReferenceObjectContextData: this.notify($"Object not implemented : {co.GetType().FullName}", NotificationType.NotImplemented); return false; default: @@ -600,6 +602,28 @@ private void writeAcdbPlaceHolder(AcdbPlaceHolder acdbPlaceHolder) { } + private void writeAnnotScaleObjectContextData(AnnotScaleObjectContextData contextData) + { + this._writer.Write(100, DxfSubclassMarker.AnnotScaleObjectContextData); + + this._writer.WriteHandle(340, contextData.Scale); + } + + private void writeBlockReferenceObjectContextData(BlockReferenceObjectContextData contextData) + { + DxfClassMap map = DxfClassMap.Create(); + + this.writeAnnotScaleObjectContextData(contextData); + + this._writer.Write(50, contextData.Rotation, map); + + this._writer.Write(10, contextData.InsertionPoint, map); + + this._writer.Write(41, contextData.XScale, map); + this._writer.Write(42, contextData.YScale, map); + this._writer.Write(43, contextData.ZScale, map); + } + private void writeDimensionAssociation(DimensionAssociation dimAssociation) { DxfClassMap map = DxfClassMap.Create(); From 94d71a59ca45ca461d9ed91d886540ca6eaca2a3 Mon Sep 17 00:00:00 2001 From: DomCR Date: Tue, 10 Mar 2026 16:54:58 +0100 Subject: [PATCH 2/3] Implement MTextAttributeObjectContextData DXF writing Refactored switch statements in DxfObjectsSectionWriter to use break instead of return for consistency. Added support for MTextAttributeObjectContextData serialization with a dedicated write method, and removed its previous "not implemented" handling. The new method writes all relevant properties to the DXF output. --- .../DxfObjectsSectionWriter.cs | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs b/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs index 5dec50b83..aea69819a 100644 --- a/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs +++ b/src/ACadSharp/IO/DXF/DxfStreamWriter/DxfObjectsSectionWriter.cs @@ -379,16 +379,19 @@ protected void writeObject(T co) { case AcdbPlaceHolder acdbPlaceHolder: this.writeAcdbPlaceHolder(acdbPlaceHolder); - return; + break; case BlockReferenceObjectContextData blockContextData: this.writeBlockReferenceObjectContextData(blockContextData); - return; + break; + case MTextAttributeObjectContextData mtextContextData: + this.writeMTextAttributeObjectContextData(mtextContextData); + break; case BookColor bookColor: this.writeBookColor(bookColor); - return; + break; case CadDictionary cadDictionary: this.writeDictionary(cadDictionary); - return; + break; case DictionaryVariable dictvar: this.writeDictionaryVariable(dictvar); break; @@ -403,10 +406,10 @@ protected void writeObject(T co) break; case ImageDefinition imageDefinition: this.writeImageDefinition(imageDefinition); - return; + break; case ImageDefinitionReactor reactor: this.writeImageDefinitionReactor(reactor); - return; + break; case Layout layout: this.writeLayout(layout); break; @@ -590,7 +593,6 @@ private bool isObjectSupported(CadObject co) case TableStyle: case ProxyObject: case BlockRepresentationData: - case MTextAttributeObjectContextData: this.notify($"Object not implemented : {co.GetType().FullName}", NotificationType.NotImplemented); return false; default: @@ -624,6 +626,22 @@ private void writeBlockReferenceObjectContextData(BlockReferenceObjectContextDat this._writer.Write(43, contextData.ZScale, map); } + private void writeMTextAttributeObjectContextData(MTextAttributeObjectContextData contextData) + { + DxfClassMap map = DxfClassMap.Create(); + + this.writeAnnotScaleObjectContextData(contextData); + + this._writer.Write(70, contextData.AttachmentPoint, map); + + this._writer.Write(50, contextData.Rotation, map); + + this._writer.Write(10, contextData.AlignmentPoint, map); + this._writer.Write(11, contextData.InsertPoint, map); + + this._writer.Write(290, contextData.Value290, map); + } + private void writeDimensionAssociation(DimensionAssociation dimAssociation) { DxfClassMap map = DxfClassMap.Create(); From 47830e78facf12b404410d9a6db902655ca11965 Mon Sep 17 00:00:00 2001 From: DomCR Date: Wed, 11 Mar 2026 09:32:00 +0100 Subject: [PATCH 3/3] Add support for BlockReference context data serialization Implemented writeBlockReferenceObjectContextData to handle BlockReferenceObjectContextData properties. Updated MultiLeader context writing to include annot scale data. Added switch case for BlockReferenceObjectContextData. Simplified writeObjectContextData by removing HasFileToExtensionDictionary bit. Improves DWG context data handling for block references and multi-leaders. --- .../DwgObjectWriter.Objects.cs | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs b/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs index 25e93125f..bfe90594b 100644 --- a/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs +++ b/src/ACadSharp/IO/DWG/DwgStreamWriters/DwgObjectWriter.Objects.cs @@ -69,9 +69,22 @@ private void writeAcdbPlaceHolder(AcdbPlaceHolder acdbPlaceHolder) private void writeAnnotScaleObjectContextData(AnnotScaleObjectContextData annotScaleObjectContextData) { + this.writeObjectContextData(annotScaleObjectContextData); + this._writer.HandleReference(DwgReferenceType.HardPointer, annotScaleObjectContextData.Scale); } + private void writeBlockReferenceObjectContextData(BlockReferenceObjectContextData contextData) + { + this.writeAnnotScaleObjectContextData(contextData); + + this._writer.WriteBitDouble(contextData.Rotation); + this._writer.Write3BitDouble(contextData.InsertionPoint); + this._writer.WriteBitDouble(contextData.XScale); + this._writer.WriteBitDouble(contextData.YScale); + this._writer.WriteBitDouble(contextData.ZScale); + } + private void writeBookColor(BookColor color) { this._writer.WriteBitShort(0); @@ -723,7 +736,9 @@ private void writeMLineStyle(MLineStyle mlineStyle) private void writeMultiLeaderAnnotContext(MultiLeaderObjectContextData multiLeaderAnnotContext) { - writeMultiLeaderAnnotContextSubObject(false, multiLeaderAnnotContext); + this.writeAnnotScaleObjectContextData(multiLeaderAnnotContext); + + this.writeMultiLeaderAnnotContextSubObject(false, multiLeaderAnnotContext); } private void writeMultiLeaderStyle(MultiLeaderStyle mLeaderStyle) @@ -862,6 +877,9 @@ private void writeObject(NonGraphicalObject obj) case BookColor bookColor: this.writeBookColor(bookColor); break; + case BlockReferenceObjectContextData blockContextData: + this.writeBlockReferenceObjectContextData(blockContextData); + break; case CadDictionaryWithDefault dictionarydef: this.writeCadDictionaryWithDefault(dictionarydef); break; @@ -896,8 +914,6 @@ private void writeObject(NonGraphicalObject obj) this.writeMultiLeaderStyle(multiLeaderStyle); break; case MultiLeaderObjectContextData multiLeaderObjectContextData: - this.writeObjectContextData(multiLeaderObjectContextData); - this.writeAnnotScaleObjectContextData(multiLeaderObjectContextData); this.writeMultiLeaderAnnotContext(multiLeaderObjectContextData); break; case PdfUnderlayDefinition pdfDefinition: @@ -938,8 +954,6 @@ private void writeObjectContextData(ObjectContextData objectContextData) { //BS 70 Version. this._writer.WriteBitShort(objectContextData.Version); - //B - Has file to extension dictionary. - this._writer.WriteBit(objectContextData.HasFileToExtensionDictionary); //B 290 Default flag. this._writer.WriteBit(objectContextData.Default); }