Associating hyperlink with BlockTableRecord

<?xml encoding=”UTF-8″>By Balaji Ramamoorthy

In ObjectARX, BlockTableRecord provides access to its hyperlink collection using the AcDbEntityHyperlinkPE. In AutoCAD 2015, the Hyperlinks collection is now also accessible using the AutoCAD .Net API.  

Here is a C++ and .Net code snippets to create a new block with hyperlink to AutoCAD Devblog :

ObjectARX C++ API :

 AcApDocument *pActiveDoc = acDocManager->mdiActiveDocument();
 AcDbDatabase *pDB = pActiveDoc->database();
 
 AcDbBlockTable *pBlockTable = NULL;
 Acad::ErrorStatus es = pDB->getBlockTable(
 						pBlockTable, kForWrite);
 <span>if</span><span> (! pBlockTable->has(ACRX_T(<span>"Test"</span><span> )))</span></span>
 <span>{</span>
 	<span>// Create the BlockTableRecord with hyperlink</span><span> </span>
 	AcDbBlockTableRecord *pBTR = <span>new</span><span>  AcDbBlockTableRecord();</span>
 	pBTR->setName(ACRX_T(<span>"Test"</span><span> ));</span>
 	AcDbObjectId btrId = AcDbObjectId::kNull;
 	pBlockTable->add(btrId, pBTR);
 
 	AcDbCircle *pCircle = <span>new</span><span>  AcDbCircle(</span>
 		AcGePoint3d::kOrigin, 
 		AcGeVector3d::kZAxis, 10.0);
 
 	pBTR->appendAcDbEntity(pCircle);
 	pCircle->close();
 
 	AcDbHyperlinkCollection * pcHCL = NULL;
 	ACRX_X_CALL(pBTR, AcDbEntityHyperlinkPE)
 		->getHyperlinkCollection(pBTR, pcHCL, <span>false</span><span> , <span>true</span><span> );</span></span>
 
 	pcHCL->addTail(
 		ACRX_T(<span>"http://adndevblog.typepad.com/autocad/"</span><span> ), </span>
 		ACRX_T(<span>"AutoCAD DevBlog"</span><span> ));</span>
 
 	ACRX_X_CALL(pBTR, AcDbEntityHyperlinkPE)
 	->setHyperlinkCollection(pBTR, pcHCL);
 			
 	<span>delete</span><span>  pcHCL;</span>
 	pBTR->close();
 <span>}</span>
 pBlockTable->close();
 

AutoCAD .Net API (should work in AutoCAD 2015+) :

 Database db = 
 	Application.DocumentManager.MdiActiveDocument.Database;
 
 <span>using</span><span>  (Transaction tr = </span>
 	db.TransactionManager.StartTransaction())
 <span>{</span>
     BlockTable bt = tr.GetObject(
                                     db.BlockTableId,
                                     OpenMode.ForRead
                                 ) as BlockTable;
 
     <span>if</span><span>  (bt.Has(<span>"MyBlock"</span><span> ) == <span>false</span><span> )</span></span></span>
     <span>{</span>
         bt.UpgradeOpen();
         BlockTableRecord btr = <span>new</span><span>  BlockTableRecord();</span>
         btr.Name = <span>"MyBlock"</span><span> ;</span>
         btr.Origin = Point3d.Origin;
         bt.Add(btr);
         tr.AddNewlyCreatedDBObject(btr, <span>true</span><span> );</span>
 
         Circle c = <span>new</span><span>  Circle(</span>
 			Point3d.Origin, 
 			Vector3d.ZAxis, 10.0);
 
         btr.AppendEntity(c);
         tr.AddNewlyCreatedDBObject(c, <span>true</span><span> );</span>
         <span>//Get the hyperlink collection from the entity</span><span> </span>
         HyperLinkCollection linkCollection = btr.Hyperlinks;
 
         <span>//Create a new hyperlink</span><span> </span>
         HyperLink hyperLink = <span>new</span><span>  HyperLink();</span>
         hyperLink.Description = <span>"AutoCAD DevBlog"</span><span> ;</span>
         hyperLink.Name 
 			= <span>"http://adndevblog.typepad.com/autocad/"</span><span> ;</span>
         hyperLink.SubLocation = <span>""</span><span> ;</span>
         linkCollection.Add(hyperLink);
     <span>}</span>
     tr.Commit();
 <span>}</span>
 


Comments

Leave a Reply

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading