<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Create and Insert Blocks?   Create and Insert AnonBlock? in ObjectARX Forum</title>
    <link>https://forums.autodesk.com/t5/objectarx-forum/create-and-insert-blocks-create-and-insert-anonblock/m-p/11437548#M2252</link>
    <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;thank you！&lt;/P&gt;&lt;P&gt;Not reserved&amp;nbsp; ids。Only blocks！&lt;/P&gt;&lt;P&gt;I don't know if this is right!&lt;/P&gt;&lt;P&gt;Why must&amp;nbsp;pEntity-&amp;gt;clone()&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;static Acad::ErrorStatus CreateAnonBlock(AcArray&amp;lt;AcDbObjectId&amp;gt; &amp;amp;selectedIds, AcDbObjectId &amp;amp;idAnonBlock)
 {
	 Acad::ErrorStatus es;
	 AcDbBlockTable *pBlockTable = NULL;

	 AcDbDatabase *pDb = acdbHostApplicationServices()-&amp;gt;workingDatabase();

	 AcDbBlockTableRecord *pAnonBlock = NULL;
	 if (idAnonBlock == AcDbObjectId::kNull)
	 {
		 if ((es = pDb-&amp;gt;getBlockTable(pBlockTable, AcDb::kForWrite))
			 != Acad::eOk)
		 {
			 acutPrintf(L"Could not open block table 无法打开块表.\n");
			 return es;
		 }

		 AcDbBlockTableRecord *pAnonBlock = new AcDbBlockTableRecord;
		 if (!pAnonBlock)
		 {
			 acutPrintf(L"Could not create new block table record.无法创建新的块表记录\n");
			 return Acad::eNullObjectPointer;
		 }
		 if ((es = pAnonBlock-&amp;gt;setName(_T("*U"))) != Acad::eOk)
		 {
			 acutPrintf(L"Could not name anonymous block.无法命名匿名块\n");
			 return es;
		 }
		 if ((es = pBlockTable-&amp;gt;add(idAnonBlock, pAnonBlock)) != Acad::eOk)
		 {
			 acutPrintf(L"Could not add anonymous block to block table.无法将匿名块添加到块表\n");
			 return es;
		 }

		 if ((es = pBlockTable-&amp;gt;close()) != Acad::eOk)
		 {
			 acutPrintf(L"Could not close block table.\n");
			 return es;
		 }
		 if ((es = pAnonBlock-&amp;gt;close()) != Acad::eOk)
		 {
			 acutPrintf(L"Could not close block table record.\n");
			 return es;
		 }
	 }

	 AcDbObjectPointer&amp;lt;AcDbBlockTableRecord&amp;gt; pAnonBlockObjectPtr(idAnonBlock, AcDb::kForWrite);

	 if ((es = pAnonBlockObjectPtr.openStatus()) != Acad::eOk)
	 {
		 acutPrintf(L"Could not open anonymous block.\n");
		 return es;
	 }


	 for (int cnt = 0; cnt &amp;lt; selectedIds.length(); cnt++)
	 {
		 AcDbObjectId entId = selectedIds.at(cnt);

		 AcDbObjectPointer&amp;lt;AcDbEntity&amp;gt; pEntity(entId, AcDb::kForWrite);
		 if (Acad::eOk == pEntity.openStatus())
		 {
			 AcDbEntity *pCloneEnt = (AcDbEntity *)pEntity-&amp;gt;clone();

			 if ((es = pAnonBlockObjectPtr-&amp;gt;appendAcDbEntity(pCloneEnt)) != Acad::eOk)
			 {
				 acutPrintf(L"Could not append entity to anonymous block.\n");
				 return es;
			 }

			 if ((es = pCloneEnt-&amp;gt;close()) != Acad::eOk)
			 {
				 acutPrintf(L"Could not close entity.\n");
				 return es;
			 }
          pEntity-&amp;gt;erase();
		  pEntity-&amp;gt;close();
		 }
	 }

	 return Acad::eOk;
 }


 static AcDbObjectId CreateBlock1(const CString &amp;amp;blkName, const AcDbObjectIdArray &amp;amp;idObjectArray, const AcGeScale3d &amp;amp;m_aScale, const double &amp;amp;m_angle)
 {
	 Acad::ErrorStatus es;
	 AcDbBlockTable *pBlkTbl = NULL;
	 acdbHostApplicationServices()-&amp;gt;workingDatabase()-&amp;gt;getBlockTable(pBlkTbl, AcDb::kForWrite);
	 AcDbBlockTableRecord *pBlkRcd = new AcDbBlockTableRecord();
	 es = pBlkRcd-&amp;gt;setName(blkName);

	 AcDbObjectId blkDefId;
	 pBlkTbl-&amp;gt;add(blkDefId, pBlkRcd);
	 pBlkTbl-&amp;gt;close();
	 AcDbObjectId entId;
	 for (INT32 i = 0; i &amp;lt; idObjectArray.length(); i++)
	 {
		 AcDbEntity *pEntity = NULL;
		 acdbOpenAcDbEntity(pEntity, idObjectArray.at(i), AcDb::kForWrite);
		 //TB: You can't append an entity to another block that is already in the modelspace.
		 //Instead clone it and append the clone:
		 AcDbEntity *pNewEntity = AcDbEntity::cast(pEntity-&amp;gt;clone());
		 es = pBlkRcd-&amp;gt;appendAcDbEntity(entId, pNewEntity);
		 if (es)
			 delete pNewEntity;
		 else
			 pNewEntity-&amp;gt;close();
		 pEntity-&amp;gt;erase();
		 pEntity-&amp;gt;close();
	 }
	 pBlkRcd-&amp;gt;close();

	 AcDbBlockReference *pBlkRef = new AcDbBlockReference(AcGePoint3d::kOrigin, blkDefId); //TB was entId
	 pBlkRef-&amp;gt;setScaleFactors(m_aScale);
	 //TB: I assume that PostToModelSpace(ent) closes the entity. So you must...
	 pBlkRef-&amp;gt;setRotation(m_angle); // ...do this _before_ PostToModelSpace(). 
	 PostToModelSpace(pBlkRef);
	 return entId;
 }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 22 Sep 2022 01:20:06 GMT</pubDate>
    <dc:creator>1127204185</dc:creator>
    <dc:date>2022-09-22T01:20:06Z</dc:date>
    <item>
      <title>Create and Insert Blocks?   Create and Insert AnonBlock?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/create-and-insert-blocks-create-and-insert-anonblock/m-p/11435443#M2250</link>
      <description>&lt;LI-CODE lang="general"&gt;static void MyGroupMyCommand () {
	ads_name ss = { 0 };
	int ret = acedSSGet(NULL, NULL, NULL, NULL, ss);		
	AcDbObjectIdArray ids;
	if (RTNORM == ret)
	{
		long len = 0;
		acedSSLength(ss, &amp;amp;len);
		for (long i = 0L; i &amp;lt; len; ++i)
		{
			ads_name ename = { 0 };
			acedSSName(ss, i, ename);
			AcDbObjectId id = AcDbObjectId::kNull;
			acdbGetObjectId(id, ename);
			ids.append(id);
	   }
		acedSSFree(ss);
	}
	CreateBlock1(_T("TTT"),ids,AcGeScale3d(1,1,1),0);  // Create and Insert Blocks
AcDbObjectId AnonblockId ;
CreateAnonBlock(ids,AnonblockId);
 }

static AcDbObjectId CreateBlock1(const CString &amp;amp;blkName, const AcDbObjectIdArray &amp;amp;idObjectArray,const AcGeScale3d &amp;amp;m_aScale,const double &amp;amp;m_angle)
 {
	 AcDbBlockTable *pBlkTbl = NULL;
	 acdbHostApplicationServices()-&amp;gt;workingDatabase()-&amp;gt;getBlockTable(pBlkTbl, AcDb::kForWrite);
	 AcDbBlockTableRecord *pBlkRcd = new AcDbBlockTableRecord();
	 pBlkRcd-&amp;gt;setName(blkName);

	 AcDbObjectId blkDefId;
	 pBlkTbl-&amp;gt;add(blkDefId, pBlkRcd);
	 pBlkTbl-&amp;gt;close();
	 AcDbObjectId entId;
	 for (INT32 i = 0; i &amp;lt; idObjectArray.length(); i++)
	 {
	 AcDbEntity *pEntity = NULL;
	 acdbOpenAcDbEntity(pEntity, idObjectArray.at(i), AcDb::kForRead);
	 pBlkRcd-&amp;gt;appendAcDbEntity(entId, pEntity);
	 }
	 pBlkRcd-&amp;gt;close();
	 AcDbBlockReference *pBlkRef = new AcDbBlockReference(AcGePoint3d::kOrigin, entId);
	 pBlkRef-&amp;gt;setScaleFactors(m_aScale);
	 PostToModelSpace(pBlkRef);
	 pBlkRef-&amp;gt;setRotation (m_angle) ;
	 return entId;
 }

static Acad::ErrorStatus CreateAnonBlock(AcArray&amp;lt;AcDbObjectId&amp;gt; &amp;amp;selectedIds, AcDbObjectId &amp;amp;idAnonBlock)
        {
                Acad::ErrorStatus es;
                AcDbBlockTable *pBlockTable = NULL;

                AcDbDatabase *pDb = acdbHostApplicationServices()-&amp;gt;workingDatabase();

                AcDbBlockTableRecord *pAnonBlock = NULL;
                if( idAnonBlock == AcDbObjectId::kNull )
                {
                        if ((es = pDb-&amp;gt;getBlockTable(pBlockTable, AcDb::kForWrite))
                                != Acad::eOk)
                        {
                                acutPrintf(L"Could not open block table 无法打开块表.\n");
                                return es;
                        }

                        AcDbBlockTableRecord* pAnonBlock = new AcDbBlockTableRecord;
                        if(!pAnonBlock)
                        {
                                acutPrintf(L"Could not create new block table record.无法创建新的块表记录\n");
                                return Acad::eNullObjectPointer;
                        }
                        if((es = pAnonBlock-&amp;gt;setName(_T("*U"))) != Acad::eOk)
                        {
                                acutPrintf(L"Could not name anonymous block.无法命名匿名块\n");
                                return es;
                        }
                        if((es = pBlockTable-&amp;gt;add(idAnonBlock, pAnonBlock)) != Acad::eOk)
                        {
                                acutPrintf(L"Could not add anonymous block to block table.无法将匿名块添加到块表\n");
                                return es;
                        }

                        if((es = pBlockTable-&amp;gt;close()) != Acad::eOk)
                        {
                                acutPrintf(L"Could not close block table.\n");
                                return es;
                        }
                        if((es = pAnonBlock-&amp;gt;close()) != Acad::eOk)
                        {
                                acutPrintf(L"Could not close block table record.\n");
                                return es;
                        }
                }

                AcDbObjectPointer&amp;lt;AcDbBlockTableRecord&amp;gt; pAnonBlockObjectPtr(idAnonBlock, AcDb::kForWrite);

                if((es = pAnonBlockObjectPtr.openStatus()) != Acad::eOk)
                {
                        acutPrintf(L"Could not open anonymous block.\n");
                        return es;
                }


                for(int cnt = 0; cnt &amp;lt; selectedIds.length(); cnt++)
                {
                        AcDbObjectId entId = selectedIds.at(cnt);

                        AcDbObjectPointer&amp;lt;AcDbEntity&amp;gt; pEntity(entId, AcDb::kForRead);
                        if(Acad::eOk == pEntity.openStatus())
                        {
                                AcDbEntity *pCloneEnt = (AcDbEntity *) pEntity-&amp;gt;clone();
                               
                                if((es = pAnonBlockObjectPtr-&amp;gt;appendAcDbEntity(pCloneEnt)) != Acad::eOk)
                                {
                                        acutPrintf(L"Could not append entity to anonymous block.\n");
                                        return es;
                                }

                                if((es = pCloneEnt-&amp;gt;close()) != Acad::eOk)
                                {
                                        acutPrintf(L"Could not close entity.\n");
                                        return es;
                                }
                        }
                }

                return Acad::eOk;
        }&lt;/LI-CODE&gt;</description>
      <pubDate>Wed, 21 Sep 2022 08:11:16 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/create-and-insert-blocks-create-and-insert-anonblock/m-p/11435443#M2250</guid>
      <dc:creator>1127204185</dc:creator>
      <dc:date>2022-09-21T08:11:16Z</dc:date>
    </item>
    <item>
      <title>Re: Create and Insert Blocks?   Create and Insert AnonBlock?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/create-and-insert-blocks-create-and-insert-anonblock/m-p/11436228#M2251</link>
      <description>&lt;P&gt;There are three bugs in&amp;nbsp;&lt;FONT face="courier new,courier"&gt;CreateBlock1(..):&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;1.) You are trying to append entities that are already in modelspace to the new block. You can't do that! Instead &lt;FONT face="courier new,courier"&gt;clone()&lt;/FONT&gt; the entities and insert their clones - just like you do it in&amp;nbsp;&lt;FONT face="courier new,courier"&gt;CreateAnonBlock()&lt;/FONT&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;2.) You are passing the wrong ObjectId to&amp;nbsp; &lt;FONT face="courier new,courier"&gt;new AcDbBlockReference(.., &lt;U&gt;entId&lt;/U&gt;)&lt;/FONT&gt;.&lt;/P&gt;
&lt;P&gt;It must be&amp;nbsp;&lt;FONT face="courier new,courier"&gt;new AcDbBlockReference(.., &lt;U&gt;blkDefId&lt;/U&gt;).&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;3.) I assume that &lt;FONT face="courier new,courier"&gt;PostToModelSpace(entity)&lt;/FONT&gt; closes &lt;FONT face="courier new,courier"&gt;entity&lt;/FONT&gt;. So you must call&lt;/P&gt;
&lt;P&gt;&lt;FONT face="courier new,courier"&gt;pBlkRef-&amp;gt;setRotation(m_angle)&lt;/FONT&gt;&amp;nbsp;&lt;U&gt;before&lt;/U&gt; &lt;FONT face="courier new,courier"&gt;PostToModelSpace(pBlkRef)&lt;/FONT&gt;.&lt;/P&gt;
&lt;P&gt;f your&amp;nbsp;&lt;FONT face="courier new,courier"&gt;PostToModelSpace(entity)&lt;/FONT&gt; doesn't close the entity you have to close it yourself!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The function &lt;FONT face="courier new,courier"&gt;CreateAnonBlock()&lt;/FONT&gt; is OK as far as I can see. It creates the unnamed block - but it doesn't append a BREF to it in the modelspace.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Below is working code. Note that the BREFs overlap the original entities:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;Acad::ErrorStatus PostToModelSpace(AcDbEntity* pEntity)
{
	AcDbObjectId objId;
    AcDbBlockTable *pBlockTable;
    AcDbBlockTableRecord *pSpaceRecord;

    acdbHostApplicationServices()-&amp;gt;workingDatabase()
        -&amp;gt;getSymbolTable(pBlockTable, AcDb::kForRead);

    pBlockTable-&amp;gt;getAt(ACDB_MODEL_SPACE, pSpaceRecord,
        AcDb::kForWrite);

    pBlockTable-&amp;gt;close();

    pSpaceRecord-&amp;gt;appendAcDbEntity(objId, pEntity);

    pEntity-&amp;gt;close();
    pSpaceRecord-&amp;gt;close();

    return Acad::eOk;
}

static AcDbObjectId CreateBlock1(const CString &amp;amp;blkName, const AcDbObjectIdArray &amp;amp;idObjectArray, const AcGeScale3d &amp;amp;m_aScale, const double &amp;amp;m_angle)
{
	Acad::ErrorStatus es;
	AcDbBlockTable *pBlkTbl = NULL;
	acdbHostApplicationServices()-&amp;gt;workingDatabase()-&amp;gt;getBlockTable(pBlkTbl, AcDb::kForWrite);
	AcDbBlockTableRecord *pBlkRcd = new AcDbBlockTableRecord();
	es = pBlkRcd-&amp;gt;setName(blkName);

	AcDbObjectId blkDefId;
	pBlkTbl-&amp;gt;add(blkDefId, pBlkRcd);
	pBlkTbl-&amp;gt;close();
	AcDbObjectId entId;
	for (INT32 i = 0; i &amp;lt; idObjectArray.length(); i++)
	{
		AcDbEntity *pEntity = NULL;
		acdbOpenAcDbEntity(pEntity, idObjectArray.at(i), AcDb::kForRead);
		//TB: You can't append an entity to another block that is already in the modelspace.
		//Instead clone it and append the clone:
		AcDbEntity *pNewEntity = AcDbEntity::cast(pEntity-&amp;gt;clone());
		pEntity-&amp;gt;close();
		es = pBlkRcd-&amp;gt;appendAcDbEntity(entId, pNewEntity);
		if (es)
			delete pNewEntity;
		else
			pNewEntity-&amp;gt;close();
	}
	pBlkRcd-&amp;gt;close();

	AcDbBlockReference *pBlkRef = new AcDbBlockReference(AcGePoint3d::kOrigin, blkDefId); //TB was entId
	pBlkRef-&amp;gt;setScaleFactors(m_aScale);
	//TB: I assume that PostToModelSpace(ent) closes the entity. So you must...
	pBlkRef-&amp;gt;setRotation(m_angle); // ...do this _before_ PostToModelSpace(). 
	PostToModelSpace(pBlkRef);
	return entId;
}

static Acad::ErrorStatus CreateAnonBlock(AcArray&amp;lt;AcDbObjectId&amp;gt; &amp;amp;selectedIds, AcDbObjectId &amp;amp;idAnonBlock)
{
	Acad::ErrorStatus es;
	AcDbBlockTable *pBlockTable = NULL;

	AcDbDatabase *pDb = acdbHostApplicationServices()-&amp;gt;workingDatabase();

	AcDbBlockTableRecord *pAnonBlock = NULL;
	if (idAnonBlock == AcDbObjectId::kNull)
	{
		if ((es = pDb-&amp;gt;getBlockTable(pBlockTable, AcDb::kForWrite))
			!= Acad::eOk)
		{
			acutPrintf(L"Could not open block table 无法打开块表.\n");
			return es;
		}

		AcDbBlockTableRecord *pAnonBlock = new AcDbBlockTableRecord;
		if (!pAnonBlock)
		{
			acutPrintf(L"Could not create new block table record.无法创建新的块表记录\n");
			return Acad::eNullObjectPointer;
		}
		if ((es = pAnonBlock-&amp;gt;setName(_T("*U"))) != Acad::eOk)
		{
			acutPrintf(L"Could not name anonymous block.无法命名匿名块\n");
			return es;
		}
		if ((es = pBlockTable-&amp;gt;add(idAnonBlock, pAnonBlock)) != Acad::eOk)
		{
			acutPrintf(L"Could not add anonymous block to block table.无法将匿名块添加到块表\n");
			return es;
		}

		if ((es = pBlockTable-&amp;gt;close()) != Acad::eOk)
		{
			acutPrintf(L"Could not close block table.\n");
			return es;
		}
		if ((es = pAnonBlock-&amp;gt;close()) != Acad::eOk)
		{
			acutPrintf(L"Could not close block table record.\n");
			return es;
		}
	}

	AcDbObjectPointer&amp;lt;AcDbBlockTableRecord&amp;gt; pAnonBlockObjectPtr(idAnonBlock, AcDb::kForWrite);

	if ((es = pAnonBlockObjectPtr.openStatus()) != Acad::eOk)
	{
		acutPrintf(L"Could not open anonymous block.\n");
		return es;
	}


	for (int cnt = 0; cnt &amp;lt; selectedIds.length(); cnt++)
	{
		AcDbObjectId entId = selectedIds.at(cnt);

		AcDbObjectPointer&amp;lt;AcDbEntity&amp;gt; pEntity(entId, AcDb::kForRead);
		if (Acad::eOk == pEntity.openStatus())
		{
			AcDbEntity *pCloneEnt = (AcDbEntity *)pEntity-&amp;gt;clone();

			if ((es = pAnonBlockObjectPtr-&amp;gt;appendAcDbEntity(pCloneEnt)) != Acad::eOk)
			{
				acutPrintf(L"Could not append entity to anonymous block.\n");
				return es;
			}

			if ((es = pCloneEnt-&amp;gt;close()) != Acad::eOk)
			{
				acutPrintf(L"Could not close entity.\n");
				return es;
			}
		}
	}

	return Acad::eOk;
}

// MyCommand / MC
static void MyGroupMyCommand() {
	ads_name ss = { 0 };
	int ret = acedSSGet(NULL, NULL, NULL, NULL, ss);
	AcDbObjectIdArray ids;
	if (RTNORM == ret)
	{
		Adesk::Int32 len = 0;
		acedSSLength(ss, &amp;amp;len);
		for (long i = 0L; i &amp;lt; len; ++i)
		{
			ads_name ename = { 0 };
			acedSSName(ss, i, ename);
			AcDbObjectId id = AcDbObjectId::kNull;
			acdbGetObjectId(id, ename);
			ids.append(id);
		}
		acedSSFree(ss);
	}
	CreateBlock1(_T("TTT"), ids, AcGeScale3d(1, 1, 1), 0);  // Create and Insert Blocks
	AcDbObjectId AnonblockId;
	CreateAnonBlock(ids, AnonblockId); // You don't insert a BREF to AnonblockId

	AcDbBlockReference *pBlkRef = new AcDbBlockReference(AcGePoint3d::kOrigin, AnonblockId); //TB was entId
	PostToModelSpace(pBlkRef);
}
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 21 Sep 2022 13:53:44 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/create-and-insert-blocks-create-and-insert-anonblock/m-p/11436228#M2251</guid>
      <dc:creator>tbrammer</dc:creator>
      <dc:date>2022-09-21T13:53:44Z</dc:date>
    </item>
    <item>
      <title>Re: Create and Insert Blocks?   Create and Insert AnonBlock?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/create-and-insert-blocks-create-and-insert-anonblock/m-p/11437548#M2252</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;thank you！&lt;/P&gt;&lt;P&gt;Not reserved&amp;nbsp; ids。Only blocks！&lt;/P&gt;&lt;P&gt;I don't know if this is right!&lt;/P&gt;&lt;P&gt;Why must&amp;nbsp;pEntity-&amp;gt;clone()&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;LI-CODE lang="general"&gt;static Acad::ErrorStatus CreateAnonBlock(AcArray&amp;lt;AcDbObjectId&amp;gt; &amp;amp;selectedIds, AcDbObjectId &amp;amp;idAnonBlock)
 {
	 Acad::ErrorStatus es;
	 AcDbBlockTable *pBlockTable = NULL;

	 AcDbDatabase *pDb = acdbHostApplicationServices()-&amp;gt;workingDatabase();

	 AcDbBlockTableRecord *pAnonBlock = NULL;
	 if (idAnonBlock == AcDbObjectId::kNull)
	 {
		 if ((es = pDb-&amp;gt;getBlockTable(pBlockTable, AcDb::kForWrite))
			 != Acad::eOk)
		 {
			 acutPrintf(L"Could not open block table 无法打开块表.\n");
			 return es;
		 }

		 AcDbBlockTableRecord *pAnonBlock = new AcDbBlockTableRecord;
		 if (!pAnonBlock)
		 {
			 acutPrintf(L"Could not create new block table record.无法创建新的块表记录\n");
			 return Acad::eNullObjectPointer;
		 }
		 if ((es = pAnonBlock-&amp;gt;setName(_T("*U"))) != Acad::eOk)
		 {
			 acutPrintf(L"Could not name anonymous block.无法命名匿名块\n");
			 return es;
		 }
		 if ((es = pBlockTable-&amp;gt;add(idAnonBlock, pAnonBlock)) != Acad::eOk)
		 {
			 acutPrintf(L"Could not add anonymous block to block table.无法将匿名块添加到块表\n");
			 return es;
		 }

		 if ((es = pBlockTable-&amp;gt;close()) != Acad::eOk)
		 {
			 acutPrintf(L"Could not close block table.\n");
			 return es;
		 }
		 if ((es = pAnonBlock-&amp;gt;close()) != Acad::eOk)
		 {
			 acutPrintf(L"Could not close block table record.\n");
			 return es;
		 }
	 }

	 AcDbObjectPointer&amp;lt;AcDbBlockTableRecord&amp;gt; pAnonBlockObjectPtr(idAnonBlock, AcDb::kForWrite);

	 if ((es = pAnonBlockObjectPtr.openStatus()) != Acad::eOk)
	 {
		 acutPrintf(L"Could not open anonymous block.\n");
		 return es;
	 }


	 for (int cnt = 0; cnt &amp;lt; selectedIds.length(); cnt++)
	 {
		 AcDbObjectId entId = selectedIds.at(cnt);

		 AcDbObjectPointer&amp;lt;AcDbEntity&amp;gt; pEntity(entId, AcDb::kForWrite);
		 if (Acad::eOk == pEntity.openStatus())
		 {
			 AcDbEntity *pCloneEnt = (AcDbEntity *)pEntity-&amp;gt;clone();

			 if ((es = pAnonBlockObjectPtr-&amp;gt;appendAcDbEntity(pCloneEnt)) != Acad::eOk)
			 {
				 acutPrintf(L"Could not append entity to anonymous block.\n");
				 return es;
			 }

			 if ((es = pCloneEnt-&amp;gt;close()) != Acad::eOk)
			 {
				 acutPrintf(L"Could not close entity.\n");
				 return es;
			 }
          pEntity-&amp;gt;erase();
		  pEntity-&amp;gt;close();
		 }
	 }

	 return Acad::eOk;
 }


 static AcDbObjectId CreateBlock1(const CString &amp;amp;blkName, const AcDbObjectIdArray &amp;amp;idObjectArray, const AcGeScale3d &amp;amp;m_aScale, const double &amp;amp;m_angle)
 {
	 Acad::ErrorStatus es;
	 AcDbBlockTable *pBlkTbl = NULL;
	 acdbHostApplicationServices()-&amp;gt;workingDatabase()-&amp;gt;getBlockTable(pBlkTbl, AcDb::kForWrite);
	 AcDbBlockTableRecord *pBlkRcd = new AcDbBlockTableRecord();
	 es = pBlkRcd-&amp;gt;setName(blkName);

	 AcDbObjectId blkDefId;
	 pBlkTbl-&amp;gt;add(blkDefId, pBlkRcd);
	 pBlkTbl-&amp;gt;close();
	 AcDbObjectId entId;
	 for (INT32 i = 0; i &amp;lt; idObjectArray.length(); i++)
	 {
		 AcDbEntity *pEntity = NULL;
		 acdbOpenAcDbEntity(pEntity, idObjectArray.at(i), AcDb::kForWrite);
		 //TB: You can't append an entity to another block that is already in the modelspace.
		 //Instead clone it and append the clone:
		 AcDbEntity *pNewEntity = AcDbEntity::cast(pEntity-&amp;gt;clone());
		 es = pBlkRcd-&amp;gt;appendAcDbEntity(entId, pNewEntity);
		 if (es)
			 delete pNewEntity;
		 else
			 pNewEntity-&amp;gt;close();
		 pEntity-&amp;gt;erase();
		 pEntity-&amp;gt;close();
	 }
	 pBlkRcd-&amp;gt;close();

	 AcDbBlockReference *pBlkRef = new AcDbBlockReference(AcGePoint3d::kOrigin, blkDefId); //TB was entId
	 pBlkRef-&amp;gt;setScaleFactors(m_aScale);
	 //TB: I assume that PostToModelSpace(ent) closes the entity. So you must...
	 pBlkRef-&amp;gt;setRotation(m_angle); // ...do this _before_ PostToModelSpace(). 
	 PostToModelSpace(pBlkRef);
	 return entId;
 }&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 22 Sep 2022 01:20:06 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/create-and-insert-blocks-create-and-insert-anonblock/m-p/11437548#M2252</guid>
      <dc:creator>1127204185</dc:creator>
      <dc:date>2022-09-22T01:20:06Z</dc:date>
    </item>
    <item>
      <title>Re: Create and Insert Blocks?   Create and Insert AnonBlock?</title>
      <link>https://forums.autodesk.com/t5/objectarx-forum/create-and-insert-blocks-create-and-insert-anonblock/m-p/11439363#M2253</link>
      <description>&lt;P&gt;&lt;SPAN&gt;&amp;gt;&amp;nbsp; Why must&amp;nbsp;pEntity-&amp;gt;clone()&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;See my comment&lt;/SPAN&gt;&lt;/P&gt;
&lt;LI-CODE lang="general"&gt;//TB: You can't append an entity to another block that is already in the modelspace.&lt;/LI-CODE&gt;
&lt;P&gt;You tried to append the entities that you selected to another block.&amp;nbsp; But these entities are alredy in the modelspace block. So you must either append clones from these entities or use&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;AcDbBlockTableRecord::assumeOwnershipOf(const AcDbObjectIdArray &amp;amp;entitiesToMove);&lt;/LI-CODE&gt;
&lt;P&gt;To &lt;U&gt;move&lt;/U&gt; them from the modelspace to another block.&lt;/P&gt;</description>
      <pubDate>Thu, 22 Sep 2022 16:30:48 GMT</pubDate>
      <guid>https://forums.autodesk.com/t5/objectarx-forum/create-and-insert-blocks-create-and-insert-anonblock/m-p/11439363#M2253</guid>
      <dc:creator>tbrammer</dc:creator>
      <dc:date>2022-09-22T16:30:48Z</dc:date>
    </item>
  </channel>
</rss>

