private void SubVarianLoadRaster() { String PIC_NAME = "C:\\_Temp_\\5525.TIF"; AcDb.Database CurDb = AcAp.Application.DocumentManager.MdiActiveDocument.Database; using (AcDb.Transaction acTrans = CurDb.TransactionManager.StartTransaction()) { try { AcDb.ObjectId dictId = AcDb.RasterImageDef.GetImageDictionary(CurDb); if (dictId == null) { dictId = AcDb.RasterImageDef.CreateImageDictionary(CurDb); } AcDb.DBDictionary dict = acTrans.GetObject(dictId, AcDb.OpenMode.ForRead) as AcDb.DBDictionary; String recName = "5525"; AcDb.RasterImageDef rid = new AcDb.RasterImageDef { SourceFileName = PIC_NAME }; dict.UpgradeOpen(); AcDb.ObjectId defId = dict.SetAt(recName, rid); rid.Load(); acTrans.AddNewlyCreatedDBObject(rid, true); AcDb.RasterImage ri = new AcDb.RasterImage { ImageDefId = defId, ShowImage = true, Orientation = new AcGe.CoordinateSystem3d(new AcGe.Point3d(200, 300, 0), new AcGe.Vector3d(1, 0, 0), new AcGe.Vector3d(0, 1, 0)) }; AcDb.BlockTable bt = acTrans.GetObject(CurDb.BlockTableId, AcDb.OpenMode.ForRead, false) as AcDb.BlockTable; AcDb.BlockTableRecord btr = acTrans.GetObject(bt[AcDb.BlockTableRecord.ModelSpace], AcDb.OpenMode.ForWrite, false) as AcDb.BlockTableRecord; btr.AppendEntity(ri); acTrans.AddNewlyCreatedDBObject(ri, true); ri.AssociateRasterDef(rid); ri.TransformBy(AcGe.Matrix3d.Scaling(1000, new AcGe.Point3d(200, 300, 0))); } catch { return; } } /* * Try * Dim PIC_NAME As String = original_picture_name * Dim dictId As ObjectId = RasterImageDef.GetImageDictionary(Db) * If dictId = Nothing Then * dictId = RasterImageDef.CreateImageDictionary(Db) * End If * Dim dict As DBDictionary = CType(acTrans.GetObject(dictId, OpenMode.ForRead), DBDictionary) * Dim recName As String = Picture_name_in_drawing * Dim rid As RasterImageDef = New RasterImageDef * rid.SourceFileName = PIC_NAME * dict.UpgradeOpen() * Dim defId As ObjectId = dict.SetAt(recName, rid) * rid.Load() * acTrans.AddNewlyCreatedDBObject(rid, True) * Dim ri As RasterImage = New RasterImage * ri.ImageDefId = defId * ri.ShowImage = True * ri.Orientation = New CoordinateSystem3d(New Point3d(x1, y1, 0), New Vector3d(1, 0, 0), New Vector3d(0, 1, 0)) * Dim bt As BlockTable * Dim btr As BlockTableRecord * bt = acTrans.GetObject(Db.BlockTableId, OpenMode.ForRead, False) * btr = acTrans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False) * btr.AppendEntity(ri) * acTrans.AddNewlyCreatedDBObject(ri, True) * ri.AssociateRasterDef(rid) * ri.TransformBy(Matrix3d.Scaling(picture_scale, New Point3d(x1, y1, 0))) * Catch * * Exit Sub * End Try * */ }
public static void ImportLayout(string layoutName, string filename) { // Get the current document and database _AcAp.Document acDoc = _AcAp.Application.DocumentManager.MdiActiveDocument; _AcDb.Database acCurDb = acDoc.Database; // Specify the layout name and drawing file to work with //string layoutName = "MAIN AND SECOND FLOOR PLAN"; //string filename = "C:\\AutoCAD\\Sample\\Sheet Sets\\Architectural\\A-01.dwg"; // Create a new database object and open the drawing into memory _AcDb.Database acExDb = new _AcDb.Database(false, true); acExDb.ReadDwgFile(filename, Autodesk.AutoCAD.DatabaseServices.FileOpenMode.OpenForReadAndAllShare, true, ""); // Create a transaction for the external drawing using (_AcDb.Transaction acTransEx = acExDb.TransactionManager.StartTransaction()) { // Get the layouts dictionary _AcDb.DBDictionary layoutsEx = acTransEx.GetObject(acExDb.LayoutDictionaryId, _AcDb.OpenMode.ForRead) as _AcDb.DBDictionary; // Check to see if the layout exists in the external drawing if (layoutsEx.Contains(layoutName) == true) { // Get the layout and block objects from the external drawing _AcDb.Layout layEx = layoutsEx.GetAt(layoutName).GetObject(_AcDb.OpenMode.ForRead) as _AcDb.Layout; _AcDb.BlockTableRecord blkBlkRecEx = acTransEx.GetObject(layEx.BlockTableRecordId, _AcDb.OpenMode.ForRead) as _AcDb.BlockTableRecord; // Get the objects from the block associated with the layout _AcDb.ObjectIdCollection idCol = new _AcDb.ObjectIdCollection(); foreach (_AcDb.ObjectId id in blkBlkRecEx) { idCol.Add(id); } // Create a transaction for the current drawing using (_AcDb.Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Get the block table and create a new block // then copy the objects between drawings _AcDb.BlockTable blkTbl = acTrans.GetObject(acCurDb.BlockTableId, _AcDb.OpenMode.ForWrite) as _AcDb.BlockTable; using (_AcDb.BlockTableRecord blkBlkRec = new _AcDb.BlockTableRecord()) { int layoutCount = layoutsEx.Count - 1; blkBlkRec.Name = "*Paper_Space" + layoutCount.ToString(); blkTbl.Add(blkBlkRec); acTrans.AddNewlyCreatedDBObject(blkBlkRec, true); acExDb.WblockCloneObjects(idCol, blkBlkRec.ObjectId, new _AcDb.IdMapping(), _AcDb.DuplicateRecordCloning.Ignore, false); // Create a new layout and then copy properties between drawings _AcDb.DBDictionary layouts = acTrans.GetObject(acCurDb.LayoutDictionaryId, _AcDb.OpenMode.ForWrite) as _AcDb.DBDictionary; using (_AcDb.Layout lay = new _AcDb.Layout()) { lay.LayoutName = layoutName; lay.AddToLayoutDictionary(acCurDb, blkBlkRec.ObjectId); acTrans.AddNewlyCreatedDBObject(lay, true); lay.CopyFrom(layEx); _AcDb.DBDictionary plSets = acTrans.GetObject(acCurDb.PlotSettingsDictionaryId, _AcDb.OpenMode.ForRead) as _AcDb.DBDictionary; // Check to see if a named page setup was assigned to the layout, // if so then copy the page setup settings if (lay.PlotSettingsName != "") { // Check to see if the page setup exists if (plSets.Contains(lay.PlotSettingsName) == false) { plSets.UpgradeOpen(); using (_AcDb.PlotSettings plSet = new _AcDb.PlotSettings(lay.ModelType)) { plSet.PlotSettingsName = lay.PlotSettingsName; plSet.AddToPlotSettingsDictionary(acCurDb); acTrans.AddNewlyCreatedDBObject(plSet, true); _AcDb.DBDictionary plSetsEx = acTransEx.GetObject(acExDb.PlotSettingsDictionaryId, _AcDb.OpenMode.ForRead) as _AcDb.DBDictionary; _AcDb.PlotSettings plSetEx = plSetsEx.GetAt(lay.PlotSettingsName).GetObject(_AcDb.OpenMode.ForRead) as _AcDb.PlotSettings; plSet.CopyFrom(plSetEx); } } } } } // Regen the drawing to get the layout tab to display acDoc.Editor.Regen(); // Save the changes made acTrans.Commit(); } } else { // Display a message if the layout could not be found in the specified drawing acDoc.Editor.WriteMessage("\nLayout '" + layoutName + "' could not be imported from '" + filename + "'."); } // Discard the changes made to the external drawing file acTransEx.Abort(); } // Close the external drawing file acExDb.Dispose(); }
public void AttachRasterImage() { // Get the current database and start a transaction AcDb.Database acCurDb; acCurDb = AcAp.Application.DocumentManager.MdiActiveDocument.Database; using (AcDb.Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Define the name and image to use string strImgName = "5525"; string strFileName = "C:\\_Temp_\\5525.TIF"; AcDb.RasterImageDef acRasterDef; bool bRasterDefCreated = false; AcDb.ObjectId acImgDefId; // Get the image dictionary AcDb.ObjectId acImgDctID = AcDb.RasterImageDef.GetImageDictionary(acCurDb); // Check to see if the dictionary does not exist, it not then create it if (acImgDctID.IsNull) { acImgDctID = AcDb.RasterImageDef.CreateImageDictionary(acCurDb); } // Open the image dictionary AcDb.DBDictionary acImgDict = acTrans.GetObject(acImgDctID, AcDb.OpenMode.ForRead) as AcDb.DBDictionary; // Check to see if the image definition already exists if (acImgDict.Contains(strImgName)) { acImgDefId = acImgDict.GetAt(strImgName); acRasterDef = acTrans.GetObject(acImgDefId, AcDb.OpenMode.ForWrite) as AcDb.RasterImageDef; } else { // Create a raster image definition AcDb.RasterImageDef acRasterDefNew = new AcDb.RasterImageDef { // Set the source for the image file SourceFileName = strFileName }; acImgDict.UpgradeOpen(); acImgDefId = acImgDict.SetAt(strImgName, acRasterDefNew); // Load the image into memory acRasterDefNew.Load(); // Add the image definition to the dictionary ////acImgDict.UpgradeOpen(); ////acImgDefId = acImgDict.SetAt(strImgName, acRasterDefNew); acTrans.AddNewlyCreatedDBObject(acRasterDefNew, true); /***/ acRasterDef = acRasterDefNew; bRasterDefCreated = true; } // Open the Block table for read AcDb.BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, AcDb.OpenMode.ForRead) as AcDb.BlockTable; // Open the Block table record Model space for write AcDb.BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[AcDb.BlockTableRecord.ModelSpace], AcDb.OpenMode.ForWrite) as AcDb.BlockTableRecord; // Create the new image and assign it the image definition using (AcDb.RasterImage acRaster = new AcDb.RasterImage()) { acRaster.ImageDefId = acImgDefId; // Use ImageWidth and ImageHeight to get the size of the image in pixels (1024 x 768). // Use ResolutionMMPerPixel to determine the number of millimeters in a pixel so you // can convert the size of the drawing into other units or millimeters based on the // drawing units used in the current drawing. // Define the width and height of the image AcGe.Vector3d width; AcGe.Vector3d height; // Check to see if the measurement is set to English (Imperial) or Metric units if (acCurDb.Measurement == AcDb.MeasurementValue.English) { width = new AcGe.Vector3d((acRasterDef.ResolutionMMPerPixel.X * acRaster.ImageWidth) / 25.4, 0, 0); height = new AcGe.Vector3d(0, (acRasterDef.ResolutionMMPerPixel.Y * acRaster.ImageHeight) / 25.4, 0); } else { width = new AcGe.Vector3d(acRasterDef.ResolutionMMPerPixel.X * acRaster.ImageWidth, 0, 0); height = new AcGe.Vector3d(0, acRasterDef.ResolutionMMPerPixel.Y * acRaster.ImageHeight, 0); } // Define the position for the image AcGe.Point3d insPt = new AcGe.Point3d(52000.0, 56000.0, 100.0); // Define and assign a coordinate system for the image's orientation AcGe.CoordinateSystem3d coordinateSystem = new AcGe.CoordinateSystem3d(insPt, width * 2, height * 2); acRaster.Orientation = coordinateSystem; // Set the rotation angle for the image acRaster.Rotation = 0; // Add the new object to the block table record and the transaction acBlkTblRec.AppendEntity(acRaster); acTrans.AddNewlyCreatedDBObject(acRaster, true); // Connect the raster definition and image together so the definition // does not appear as "unreferenced" in the External References palette. /*AcDb.RasterImage.EnableReactors(true);*/ acRaster.AssociateRasterDef(acRasterDef); acRaster.ShowImage = true; acRaster.ColorIndex = 200; acRaster.ImageTransparency = true; acRaster.Orientation = new AcGe.CoordinateSystem3d(insPt, new AcGe.Vector3d(1000, 0, 0), new AcGe.Vector3d(0, 2000, 0)); if (bRasterDefCreated) { acRasterDef.Dispose(); } } // Save the new object to the database acTrans.Commit(); // Dispose of the transaction } }