当前位置: 首页 > 工具软件 > QCAD > 使用案例 >

QCAD 代码片段(一)

顾俊哲
2023-12-01

Draw 绘制


    var di = this.getDocumentInterface();
    var document = this.getDocument();
    var op = new RAddObjectsOperation();
    for (var h=0; h<=255; h+=16) {
        for (var v=0; v<=255; v+=16) {
            for (var s=0; s<=255; s+=16) {
                // RShape-->RLine
                var line = new RLine(new RVector(h/16, v/16+s), new RVector(h/16, v/16+s+0.5));
                // RLineData-->REntiy
                var lineEntity = new RLineEntity(document, new RLineData(line));
                // 添加扩展属性
                lineEntiy.setProperty(RPropertyTypeId("扩展属性","长度"),10000);
                var proAttr=new RPropertyAttributes();
                proAttr.setOption(RPropertyAttributes.Integer,true);
                lineEntiy.setCustomPropertyAttributes("扩展属性","长度",proAttr);
                var c = new RColor();
                c.setHsv(h,s,v);
                lineEntity.setColor(c);
                //
                op.addObject(lineEntity, false);
            }
        }
    }
    di.applyOperation(op);

RMainWindowQt & RMainWindow & RDocument

// Creating the storage underneath the document:
var storage = new RMemoryStorage();
 
// Creating the spatial index:
var spatialIndex = new RSpatialIndexNavel();
 
// Creating the document:
var document = new RDocument(storage, spatialIndex);
 
// Creating the document interface 
// (required for import / export, graphics scenes and views):
var documentInterface = new RDocumentInterface(document);
// create drawing document with document interface:
    RMemoryStorage* storage = new RMemoryStorage();
    RSpatialIndexNavel* spatialIndex = new RSpatialIndexNavel();
    RDocument* document = new RDocument(*storage, *spatialIndex);
    documentInterface = new RDocumentInterface(*document);

RLayer 创建图层

// add a layer 'MyLayer':
    QSharedPointer<RLayer> layer = 
        QSharedPointer<RLayer>(
            new RLayer(document, "MyLayer")
        );
    layer->setLinetypeId(document->getLinetypeId("continuous"));
    layer->setLineweight(RLineweight::Weight025);
    layer->setColor(RColor(255,0,0));

Draw 绘制线


 // create and add a line entity:
    QSharedPointer<RLineEntity> lineEntity = 
        QSharedPointer<RLineEntity>(
            new RLineEntity(document, RLineData(RVector(0,0), RVector(100,0)))
        );

    // set attributes:
    lineEntity->setLayerId(layerId);
    lineEntity->setColor(RColor(0,128,255));
    lineEntity->setLinetypeId(document->getLinetypeId("dashed"));
    lineEntity->setLineweight(RLineweight::Weight100);

    // set a custom property:
    lineEntity->setCustomProperty("MyApp", "MyIntProperty", 77);
    lineEntity->setCustomProperty("MyApp", "MyStringProperty", "Some text");

    op = new RAddObjectOperation(
        lineEntity, 
        false       // false: don't use current attributes but 
                    //        custom attributes set above
    );

    // add the line entity to the drawing:
    documentInterface->applyOperation(op);

Draw 绘制点

    RAddObjectsOperation*op=new RAddObjectsOperation();
    QSharedPointer<RPointEntity> pointEntity =
            QSharedPointer<RPointEntity>(new RPointEntity(this->getDocument(), RPointData(_point)));
    op->addObject(pointEntity);
    this->documentInterface->applyOperation(op);

Scene&View

var graphicsScene = new RGraphicsSceneQt(documentInterface)
var graphicsView = new RGraphicsViewQt();
graphicsView.setScene(graphicsScene);
var di = this.getDocumentInterface();
var view = di.getLastKnownViewWithFocus();
view = view.getRGraphicsView();

User Input 用户输入

    RDocumentInterface* di = RMainWindow::getDocumentInterfaceStatic();
    di->setCurrentAction(new RPointAction(guiAction));

多线程绘制

int painterThreadCount=6;
QList<RIdBox > entities;
int slice = int(floor(double(entities.length())/painterThreadCount));
QList<QFuture<void> > futureThread;
for (int threadId=0; threadId<painterThreadCount; threadId++) {
    int start = threadId*slice;
    int end = (threadId+1)*slice;
    if (threadId==painterThreadCount-1) {
        end = list.length();
    }
    //qDebug() << "slice:" << start << end;
    futureThread.append(QtConcurrent::run(this, &RGraphicsViewImage::paintEntitiesThread, list, start, end));
}
//RDebug::stopTimer(100, "launch threads");

//RDebug::startTimer(100);
for (int i=0; i<futureThread.length(); i++) {
    futureThread[i].waitForFinished();
}

//
void RGraphicsViewImage::paintEntitiesThread( QList<REntity::Id>& list, int start, int end) {
    for (int i=start; i<end; i++) {
        paintEntityThread(list[i]);
    }
}

void RGraphicsViewImage::paintEntityThread(REntity::Id id){
    QSharedPointer<REntity> entity = storage.queryEntityDirect(id);
    if (entity.isNull()) {
        return;
    }
    if (entity->isUndone()) {
        return;
    }

    entity->update();

    RObject::Id entityId = entity->getId();
    QList<RBox> bbs = entity->getBoundingBoxes(true);
    


}
 QSet<REntity::Id> ids = document->queryAllBlockReferences();
    QList<REntity::Id> list=document->getStorage().orderBackToFront(ids);
    //
    //RSettings.getIntValue("GraphicsView/Threads", Math.max(RS.getIdealThreadCount(), 6));
    int threadCount=RSettings::getIntValue("GraphicsView/Threads",qMax(QThread::idealThreadCount(), 10));
    int slice=int(floor(double((list.length()))/threadCount));
    QList<QFuture<void> >futureThread;
    for(int threadId=0;threadId<threadCount;threadId++){
        int start = threadId*slice;
        int end = (threadId+1)*slice;
        if (threadId==threadCount-1) {
            end = list.length();
        }
        qDebug() << "slice:" << start << end;
        futureThread.append(QtConcurrent::run(this,&RDxfImporter::importEntitiesThread, list, start, end));
    }
    for (int i=0; i<futureThread.length(); i++) {
        futureThread[i].waitForFinished();
    }
void RDxfImporter::importEntitiesThread(QList<RObject::Id> &list, int start, int end)
{

    for (int i=start; i<end; i++) {
        RBlockReferenceEntity::Id id = list[i];
        QSharedPointer<REntity> entity = document->queryEntityDirect(id);
        if (entity.isNull()) {
            continue;
        }
        QSharedPointer<RBlockReferenceEntity> blockRef = entity.dynamicCast<RBlockReferenceEntity>();
        if (blockRef.isNull()) {
            continue;
        }

        QList<RBox> bbs = blockRef->getBoundingBoxes();
        QVariant v = blockRef->getCustomProperty("", "block");
        if (!v.isValid()) {
            continue;
        }
        QString blockName = v.toString();
        RBlock::Id blockId = document->getBlockId(blockName);

        if (blockId==RBlock::INVALID_ID) {
            continue;
        }

        blockRef->setReferencedBlockId(blockId);

        document->removeFromSpatialIndex(blockRef, bbs);
        document->addToSpatialIndex(blockRef);
    }

}

获取指定窗口的控件的值

var appWin=RMainWindowQt.getMainWindow();
var dock=appWin.findChild("FilterEditorDock");
var entityTypeCombo=dock.findChild("comboBoxEntityType");
var value=entityTypeCombo.currentIndex;

查询选择实体的属性值

var di=EAction.getDocumentInterface();
var doc = di.getDocument();
var entities = doc.querySelectedEntities();
var storage=doc.getStorage();
var entity=storage.queryEntityDirect(entities[0]);
entity.getProperty(RBlockReferenceEntity.PropertyBlock)
entity.getProperty(RTextEntity.PropertyText)
entity.getProperty(REntity.PropertyType)[1].isStyle()

警告对话框

{
var appWin = EAction.getMainWindow();
QMessageBox.warning(appWin,qsTr("Warning"),"warning");
}

确认对话框

var appWin = EAction.getMainWindow();
var buttons = new QMessageBox.StandardButtons(QMessageBox.Yes, QMessageBox.No);
var ret = QMessageBox.warning(app, 
    qsTr("Delete layer?"), 
    qsTr("Do you wish to delete  \"%1\" layer?").arg(fileToSave),
    buttons);
if (ret!=QMessageBox.Yes) {
    
}

获取图层

var di = EAction.getDocumentInterface();
var doc=di.getDocument();
var layer=doc.queryLayer("0");
layer.isProtected();

导入导出文件和修改

var storage = new RMemoryStorage();
var spatialIndex = new RSpatialIndexSimple();
var doc = new RDocument(storage, spatialIndex);
var di = new RDocumentInterface(doc);
di.importFile("in.dxf");

var op = new RModifyObjectsOperation();

var ids = doc.queryAllEntities();
for (var i=0; i<ids.length; i++) {
    var id = ids[i];
    var entity = doc.queryEntity(id);
    entity.setColor(new RColor("blue"));
    op.addObject(entity, false);
}
di.applyOperation(op);
di.exportFile("out.dxf", "R24 (2010) DXF");

监听导出事件

var adapter = new RExportListenerAdapter();

// register export listener:
var appWin = EAction.getMainWindow();
appWin.addExportListener(adapter);

// connect postExport signal to function ExExportListener.fileExported:
adapter.postExport.connect(function(documentInterface){
    if(isNull(documentInterface)){
        return;
    }
    print("file saved: ",documentInterface.getDocument().getFileName());
});

事务监听

// create a new transaction listener:
    var adapter = new RTransactionListenerAdapter();
    var appWin = EAction.getMainWindow();
    appWin.addTransactionListener(adapter);

    // connect transactionUpdated signal to a function that prints
    // information about the transaction:
    adapter.transactionUpdated.connect(function(document, transaction) {
        if (isNull(document) || isNull(transaction)) {
            return;
        }

        var objIds = transaction.getAffectedObjects();
        EAction.handleUserMessage(qsTr("Transaction affected %n object(s).", "", objIds.length));
        if (objIds.length<10) {
            EAction.handleUserMessage("Object IDs: " + objIds.join(','));
        }

        var i, objId;

        // show property changes of first 10 entities:
        for (i=0; i<objIds.length && i<10; i++) {
            objId = objIds[i];

            EAction.handleUserMessage("Changed object ID: " + objId);

            var pre = "&nbsp;&nbsp;&nbsp;";

            var changes = transaction.getPropertyChanges(objId);
            for (var k=0; k<changes.length; k++) {
                var change = changes[k];
                var pid = change.getPropertyTypeId();

                if (pid.isCustom()) {
                    // custom property was changed:
                    EAction.handleUserMessage(pre + "custom property:" + pid.getPropertyTitle(), false);
                }
                else {
                    // other property:
                    // see RObject::Property*, REntity::Property*, RLineEntity::Property*, etc:
                    EAction.handleUserMessage(pre + "property type:" + pid, false);
                }

                EAction.handleUserMessage(pre + "old value:" + change.getOldValue(), false);
                EAction.handleUserMessage(pre + "new value:" + change.getNewValue(), false);
            }
        }

        // show objects that were created or deleted:
        objIds = transaction.getStatusChanges();
        for (i=0; i<objIds.length && i<10; i++) {
            objId = objIds[i];

            var obj = document.queryObjectDirect(objId);
            //isUndone==delete
            if (obj.isUndone()) {
                EAction.handleUserMessage("Deleted object with ID: " + objId);
            }
            else {
                EAction.handleUserMessage("Created object with ID: " + objId);
            }

            if (isLayer(obj)) {
                EAction.handleUserMessage("Object is layer");
            }
            else if (isBlock(obj)) {
                EAction.handleUserMessage("Object is block");
            }
            else if (isEntity(obj)) {
                EAction.handleUserMessage("Object is entity");
            }
        }
    });

增加删除 Entity Object

var di = this.getDocumentInterface();
var document = this.getDocument();

var op, entity, id;

// add line entity,
// document takes ownership of entity:
op = new RAddObjectsOperation();
entity = new RLineEntity(document, new RLineData(new RVector(0,0), new RVector(100,100)));
op.addObject(entity);
di.applyOperation(op);

// after applying the operation, the ID of the newly added entity is known
// and can be stored as reference for the added entity:
id = entity.getId();
EAction.handleUserMessage(qsTr("Added line with ID %1".arg(id)));

// query a copy of the stored entity from the document
// and use it to delete the entity:
entity = document.queryEntity(id);
op = new RDeleteObjectsOperation();
op.deleteObject(entity);
di.applyOperation(op);

EAction.handleUserMessage(qsTr("Deleted line with ID %1").arg(id));
EAction.handleUserMessage(qsTr("You can use <i>Edit > Undo</i> to restore the line entity."), false);

添加自定义属性

 //dataType
    var type_property=new RPropertyTypeId("app","group");
    entity.setProperty(type_property,group);
    var type_attri=new RPropertyAttributes();
    type_attri.setOption(RPropertyAttributes.Custom,true);
    type_attri.setReadOnly(true);
    type_attri.setInvisible(true);
    entity.setCustomPropertyAttributes("app","group",type_attri);
 类似资料: