[CommandMethod("MoveSticker", CommandFlags.Modal)] public static void MoveStickerCommand() // This method can have any name { string strBlockLayout = String.Empty; string strDwgSize = String.Empty; BlockReference brSticker = null; BlockReference brTitleBlock = null; Point3d p3dLo = new Point3d(0, 0, 0); Point3d p3dHi = new Point3d(0, 0, 0); Boolean blnSpotFound = false; double dblBlockScaleMax = 25.4; double dblBlockScale = dblBlockScaleMax; string stickerHandle = String.Empty; ObjectId oidSticker = ObjectId.Null; ObjectId oidFrame = ObjectId.Null; string strFrame = String.Empty; UserPreferences.Instance.Reinitialize(); // Message to confirm beginning of routine Document acDoc = Application.DocumentManager.MdiActiveDocument; acDoc.Editor.WriteMessage("Beginning routine."); acDoc.Editor.WriteMessage("\nSelecting folder for batch update."); // Select folder for batch updates FolderBrowserDialog fbdDialog = new FolderBrowserDialog(); DialogResult drResult = fbdDialog.ShowDialog(); if (drResult != DialogResult.OK) { return; } string strFileContainer = fbdDialog.SelectedPath; acDoc.Editor.WriteMessage("\nSelected folder:" + strFileContainer + "."); // Get all drawing files from folder acDoc.Editor.WriteMessage("\nGetting drawing files from " + strFileContainer + "."); DirectoryInfo di = new DirectoryInfo(strFileContainer); FileInfo[] fi = di.GetFiles("*.dwg", SearchOption.TopDirectoryOnly); // Create folders for processed drawings string strStickerDir = strFileContainer + "\\I AM GROOT"; acDoc.Editor.WriteMessage("\nCreating folder " + strStickerDir + "."); DirectoryInfo diSticker = Directory.CreateDirectory(strStickerDir); foreach (FileInfo f in fi) { String strDrwName = Path.GetFileNameWithoutExtension(f.Name); acDoc.Editor.WriteMessage("\nWorking on drawing " + strDrwName + "."); String strDrwFileName = di.FullName + "\\" + strDrwName + ".dwg"; Document acDrwDoc = Application.DocumentManager.Open(f.FullName, false); Editor ed = acDrwDoc.Editor; AcadHelper.ZoomExtents(); foreach (String strLayout in UserPreferences.Instance.PossibleBlockLayouts) { brSticker = AcadHelper.GetBlockReferenceFromPrefix("sticker", strLayout, acDrwDoc.Database); if (brSticker != null) { strBlockLayout = strLayout; break; } } foreach (String strBlockID in UserPreferences.Instance.PossibleAttributeBlockNames) { brTitleBlock = AcadHelper.GetBlockReferenceFromPrefix(strBlockID, strBlockLayout, acDrwDoc.Database); if (brTitleBlock != null) { using (OpenCloseTransaction octNewTrans = new OpenCloseTransaction()) { foreach (ObjectId oidAttID in brTitleBlock.AttributeCollection) { AttributeReference atr = octNewTrans.GetObject(oidAttID, OpenMode.ForRead) as AttributeReference; if (String.Equals(atr.Tag, UserPreferences.Instance.VendorDwgSizeAttributeName, StringComparison.OrdinalIgnoreCase)) { // Define drawing size strFrame = "Z_" + atr.TextString.ToUpper() + "_FRAME"; break; } } } break; } } Point3d p3dFrameLo = Point3d.Origin; Point3d p3dFrameHi = Point3d.Origin; BlockReference brFrame = AcadHelper.GetBlockReferenceFromPrefix(strFrame, strBlockLayout, acDrwDoc.Database); p3dFrameLo = brFrame.GeometricExtents.MinPoint; p3dFrameHi = brFrame.GeometricExtents.MaxPoint; double dblDelXSticker = brSticker.GeometricExtents.MaxPoint.X - brSticker.GeometricExtents.MinPoint.X; double dblDelYSticker = brSticker.GeometricExtents.MaxPoint.Y - brSticker.GeometricExtents.MinPoint.Y; double dblScale = 1; double dblX = p3dFrameHi.X - dblDelXSticker * dblScale; double dblY = p3dFrameLo.Y + 10; Point3d p3dLow = new Point3d(0,0,0); Point3d p3dHigh = new Point3d(dblDelXSticker, dblDelYSticker, 0); while (dblScale >= 0.5) { while (dblX > p3dFrameLo.X + 10) { while (dblY < p3dFrameHi.Y - dblDelYSticker) { p3dLow = new Point3d(dblX, dblY, 0); p3dHigh = new Point3d(dblX + dblDelXSticker*dblScale, dblY + dblDelYSticker*dblScale, 0); PromptSelectionResult psr = ed.SelectCrossingWindow(p3dLow, p3dHigh); if (psr.Value == null) { blnSpotFound = true; break; } else { dblY = dblY + 5; } } if (blnSpotFound) { break; } dblY = p3dFrameLo.Y + 10; dblX = dblX - 5; } if (blnSpotFound) { break; } dblScale = dblScale - 0.1; dblX = p3dFrameHi.X - dblDelXSticker * dblScale; dblY = p3dFrameLo.Y + 10; } /* if (!blnSpotFound) { entSticker.TransformBy(Matrix3d.Scaling(dblBlockScaleMax, entSticker.GeometricExtents.MinPoint)); v3d = entSticker.GeometricExtents.MinPoint.GetVectorTo(entFrame.GeometricExtents.MinPoint); entSticker.TransformBy(Matrix3d.Displacement(v3d)); } */ if (blnSpotFound) { acDoc.Database.SaveAs(strStickerDir + "\\" + f.Name,DwgVersion.Current); } acDoc.CloseAndDiscard(); } }