public static void AlignBlockCommand() { var options = new PromptEntityOptions("\nSelect polyline: "); options.SetRejectMessage("Objet non valide."); options.AddAllowedClass(typeof(Polyline), true); var result = Quick.Editor.GetEntity(options); if (result.Status != PromptStatus.OK) { return; } var lineId = result.ObjectId; options.Message = "\nSelect block: "; options.RemoveAllowedClass(typeof(Polyline)); options.AddAllowedClass(typeof(BlockReference), true); result = Quick.Editor.GetEntity(options); if (result.Status != PromptStatus.OK) { return; } var blockId = result.ObjectId; var db = lineId.Database; using (var trans = db.TransactionManager.StartTransaction()) { try { var line = trans.GetObject(lineId, OpenMode.ForRead) as Polyline; var blockRef = trans.GetObject(blockId, OpenMode.ForWrite) as BlockReference; var blockpos = blockRef.Position; var pointOverLine = line.GetClosestPointTo(blockRef.Position, false); blockRef.Position = pointOverLine; // move //angel between block to the nearest point var b2near = blockpos.Convert2d(new Plane()).GetVectorTo(pointOverLine.Convert2d(new Plane())).Angle *Rad2Deg; blockRef.Rotation = (b2near - 90) * Deg2Rad; //-90 to convert to block plane (0 is downwards). trans.Commit(); } catch (Exception ex) { Quick.WriteLine(ex.Message + "\n" + ex.StackTrace); } } }