Как экспортировать объекты методом WBlock в исходную точку нового чертежа - PullRequest
0 голосов
/ 24 июня 2019

Мне нужно экспортировать некоторые объекты, выбранные пользователем.Эта первая часть завершена, но теперь мне нужно поместить экспортируемые объекты в исходную точку нового чертежа, не открывая этот чертеж.Минимальная точка экстента выбранных объектов должна находиться в исходной точке.

Я не нашел, как выбрать объекты во внешнем пространстве модели и как переместить их в исходную точку.

// Create a new external database, where the
// exported objects will be created.
using (var newDb = new Database(true, false))
{    
    // objIds is an array of obejcts selected
    // by the user.
    db.Wblock(newDb, objIds, Point3d.Origin,
                                DuplicateRecordCloning.Ignore);
    newDb.SaveAs(MyFileName, DwgVersion.Newest);
}

// Here it's what I've tried: Open the 
// drawing with the ReadDWgFile method
// and to select all objects from model space,
// but no success.
using (var exDb = new Database(false, false))
{
        try
        {
            exDb.ReadDwgFile(MyFileName,
            FileOpenMode.OpenForReadAndWriteNoShare, false, "");
        }
        catch (System.Exception)
        {
            ed.WriteMessage("\nUnable to read drawing file.");
        }

        using (var exTr = exDb.TransactionManager.StartTransaction())
        {
            // Open the Block table record for read
            BlockTable exBlkTbl;
            exBlkTbl = exTr.GetObject(exDb.BlockTableId,
                                      OpenMode.ForRead) as BlockTable;

            // Open the Block table record Model space for read
            BlockTableRecord exBlkTblRec;
            exBlkTblRec = exTr.GetObject(exBlkTbl[BlockTableRecord.ModelSpace],
               OpenMode.ForRead) as BlockTableRecord;

            // Here I don't know how to proceed to 
            // get the objects from the model space
            // and then move to the origin point.
        }
}

Спасибо

Ответы [ 3 ]

0 голосов
/ 25 июня 2019

Ну, как только я не нашел способа изменить внешнюю базу данных, я нашел решение по-другому.Сначала я перемещаю выбранные объекты в исходную точку текущего чертежа внутри транзакции.Затем выполняется экспорт с использованием метода wblock, в котором точка начала указывается в качестве аргумента BasePoint, и, наконец, удаляется первая транзакция без фиксации, при этом объекты остаются в исходной точке текущего чертежа.

Кстати, лучшее решение приветствуется.

using (var trMoveToOrigin = db.TransactionManager.StartTransaction())
{
// Get the extents points 
// of the selected objects.
var extPts = trMoveToOrigin.GetExtents(objIdArray);
var minExPt = extPts.MinPoint;

// Get vector from minimal extent point
// to the origin point, that will be
// used to move the selected objects.
Vector3d acVec3d = minExPt.GetVectorTo(Point3d.Origin);

foreach (ObjectId objId in objIds)
{
    Entity e = trMoveToOrigin.GetObject(objId, OpenMode.ForWrite) as Entity;
    e.TransformBy(Matrix3d.Displacement(acVec3d));
}

// Create a new external database, where the
// exported objects will be created.
using (var newDb = new Database(true, false))
{
    using (var trExport = db.TransactionManager.StartTransaction())
    {
        db.Wblock(newDb, objIds, Point3d.Origin,
                            DuplicateRecordCloning.Ignore);
        newDb.SaveAs(FileName, DwgVersion.Newest);
        trExport.Commit();
    }
}

// Dispose without commit, because the
// objects need to be in your original point
// at the end of the program.
trMoveToOrigin.Dispose();
}
0 голосов
/ 27 июня 2019

@ LeeMac, как я прокомментировал ваш ответ, я пытался указать аргумент basepoint для метода wblock, но он не дал результатов.Экспортированные объекты в новом чертеже все еще находятся в той же точке, что и исходные объекты в исходном чертеже.

using(Transaction tr = db.TransactionManager.StartTransaction())
{
    // Get the extents points 
    // of the selected objects.
    var extPts = tr.GetExtents(objIdArray);
    var minExPt = extPts.MinPoint;

    // Create a new external database, where the
    // exported objects will be created.
    using (var newDb = new Database(true, false))
    {
        using (var trExport = db.TransactionManager.StartTransaction())
        {
            db.Wblock(newDb, objIds, minExPt, DuplicateRecordCloning.Ignore);
            newDb.SaveAs(FileName, DwgVersion.Newest);
            trExport.Commit();
        }
    }
}

Изображение: объекты на исходном чертеже, выбранные для экспорта

Изображение: объекты на новом чертеже все еще находятся в той же точке, что и исходные объекты

И я понял, что эта базовая точка, поставляемая в метод wblock, используется только тогда, когда экспортированные объекты вставляются как блокна чертеже.

Изображение: предоставленный minExPt используется только тогда, когда экспортируемые объекты вставляются как блок

Я также тестировал команду WBLOCK, и происходит то же самоекогда я нажимаю на базовую точку.

0 голосов
/ 24 июня 2019

Вместо того, чтобы перемещать объекты, созданные в новом чертеже с помощью операции wblock, я бы предложил снабдить метод wblock аргументом базовой точки, равнымлевый экстент выделения объектов - в настоящее время вы указываете начало координат в качестве базовой точки (Point3d.Origin).

Например, основываясь на коде, опубликованном в вашем ответе, вы можете попробовать указать переменную minExPt в качестве аргумента базовой точки, например:

db.Wblock(newDb, objIds, minExPt, DuplicateRecordCloning.Ignore);

Это приведет к появлению новых объектов.располагаться в нижнем левом углу прямоугольных экстентов в начале нового чертежа.

...