Programmation

Développement ObjectARX AutoCAD :
Module de conception de façades (mur Bois/Bloc)

Programmation

Programmation

Evaluez vos connaissances sur AutoCAD :
Questionnaires sur les Xréfs et sur les Blocs.

Code ObjectARX, C# et API



Extraits de code pour insérer un bloc existant dans le dessin en cours :


ObjectARX C++ API
void insertBlocExistant(TCHAR* nomBloc, AcGePoint3d ptInsBloc, double angleBloc)
{
    Acad::ErrorStatus errSt;
    AcDbBlockTable *adTabBlocs;
    errSt = acdbHostApplicationServices()->workingDatabase()->getSymbolTable(adTabBlocs, AcDb::kForRead);

    if( errSt != Acad::eOk)
        return;

    if( !adTabBlocs->has(nomBloc))
        return;

    AcDbObjectId blocId;
    adTabBlocs->getAt(nomBloc, blocId);

    AcDbBlockTableRecord *pBlockTableRecord;
    adTabBlocs->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);
    adTabBlocs->close();

    AcDbBlockReference *adBlocRef = new AcDbBlockReference(ptInsBloc, blocId);
    adBlocRef->setRotation(angleBloc);
    pBlockTableRecord->appendAcDbEntity(adBlocRef);
    pBlockTableRecord->close();

    AcDbBlockTableRecord *adBlocDef;
    errSt = acdbOpenObject(adBlocDef, blocId, AcDb::kForRead);
    if (errSt != Acad::eOk) {
        delete adBlocRef;
        return;
    }

    if(adBlocDef->hasAttributeDefinitions()) {

        AcDbBlockTableRecordIterator *adBTRIterateur;
        adBlocDef->newIterator(adBTRIterateur);

        AcDbEntity *adEnt;
        AcDbAttributeDefinition *attribDef;
        for (adBTRIterateur->start(); !adBTRIterateur->done(); adBTRIterateur->step()) {
            adBTRIterateur->getEntity(adEnt, AcDb::kForRead);
            attribDef = AcDbAttributeDefinition::cast(adEnt);

            if (attribDef != NULL) {
                AcDbAttribute *adAttribRef = new AcDbAttribute();
                adAttribRef->setAttributeFromBlock(attribDef, adBlocRef->blockTransform());
                adBlocRef->appendAttribute(adAttribRef);
                adAttribRef->close();
            }

            adEnt->close();
        }// Fin for

        delete adBTRIterateur;
        adBlocDef->close();
    }

    adBlocRef->close();
}
 
▲haut de page

C#
public void InsertBlocExistant(string nomBloc, Point3d ptInsBloc, double angleBloc)
{
    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
    Document adrDoc = Application.DocumentManager.MdiActiveDocument;
    Database adrDB = adrDoc.Database;

    try
    {
        using (Transaction tr = adrDB.TransactionManager.StartTransaction())
        {
            BlockTable adTableBlocs = (BlockTable)(tr.GetObject(adrDB.BlockTableId, OpenMode.ForRead));

            if (adTableBlocs.Has(nomBloc))
            {                  
                ObjectId blocId = adTableBlocs[nomBloc];
                adrDoc.LockDocument();

                BlockTableRecord adBTR = (BlockTableRecord)tr.GetObject(adTableBlocs[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

                BlockTableRecord adCurrBloc = (BlockTableRecord)tr.GetObject(blocId, OpenMode.ForRead);

                BlockReference adBlcRef = new BlockReference(ptInsBloc, blocId);
                adBlcRef.Rotation = angleBloc;

                adBTR.AppendEntity(adBlcRef);                        
                tr.AddNewlyCreatedDBObject(adBlcRef, true);

                foreach (ObjectId entId in adCurrBloc)
                {
                    if (!(entId.ObjectClass.Name == "AcDbAttributeDefinition"))
                    {
                        continue;
                    }

                    AttributeDefinition attribDef = tr.GetObject(entId, OpenMode.ForRead) as AttributeDefinition;

                    AttributeReference adAttribRef = new AttributeReference();

                    adAttribRef.SetAttributeFromBlock(attribDef, adBlcRef.BlockTransform);                            
                    adBlcRef.AttributeCollection.AppendAttribute(adAttribRef);                            

                    tr.AddNewlyCreatedDBObject(adAttribRef, true);
                }

                tr.Commit();
            }
        }
    }
    catch (System.Exception ex)
    {
        ed.WriteMessage(String.Format("\n InsertBlocExistant {0} :", ex.Message));
    }
}
 
▲haut de page