<commit_before>﻿/*
 * User: aleksey.nakoryakov
 * Date: 13.05.13
 * Time: 14:39
 */
using System;
using System.Collections.Generic;
using System.Linq;
using Autodesk.AutoCAD.DatabaseServices;

namespace LayoutsFromModel
{
	/// <summary>
	/// Класс, создающий коллекцию границ чертежей из вхождений блоков
	/// </summary>
	public class BlocksBordersBuilder : IBordersCollectionBuilder
	{
		private Database _wdb = HostApplicationServices.WorkingDatabase;
		
		public int InitialBorderIndex { get; set; }
		
		/// <summary>
		/// Получение границ из вхождений блоков
		/// </summary>
		/// <returns>Массив границ чертежей</returns>
		public DrawingBorders[] GetDrawingBorders()
		{
			List<DrawingBorders> borders = new List<DrawingBorders>();
			
			string blockname = Configuration.AppConfig.Instance.BlockName;
			if (string.IsNullOrEmpty(blockname))
				throw new System.Exception("Не задано имя блока рамки");
			
			using (Transaction tr = _wdb.TransactionManager.StartTransaction())
			{
				// Получаем коллекцию ObjectId вхождений блока blockname, затем сортируем
				// "построчно"
				var blockRefs = GetBlockReferences(blockname)
					.Select(n => (BlockReference)tr.GetObject(n, OpenMode.ForRead))
					.OrderByDescending(n => n.Position.Y)
					.ThenBy(n => n.Position.X)
					.Select(n => n.ObjectId);
				
				int borderIndex = InitialBorderIndex;
				
				foreach (var bref in blockRefs)
				{
					string borderName = string.Format("{0}{1}{2}",
					                                  Configuration.AppConfig.Instance.Prefix,
					                                  borderIndex++,
					                                  Configuration.AppConfig.Instance.Suffix);
					borders.Add(CreateBorder(bref, borderName));
				}
				tr.Commit();
			}
			
			return borders.ToArray();
		}
		
		private List<ObjectId> GetBlockReferences(string blockname)
		{
			List<ObjectId> result = null;
			using (Transaction tr = _wdb.TransactionManager.StartTransaction())
			{
				BlockTable bt = (BlockTable)tr.GetObject(_wdb.BlockTableId, OpenMode.ForRead);
				BlockTableRecord btr = null;
				if (bt.Has(blockname))
					btr = (BlockTableRecord)tr.GetObject(bt[blockname], OpenMode.ForRead);
				else
					throw new ArgumentException("blockname");
				ObjectId modelId = ((BlockTableRecord)tr
				                    .GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead)).ObjectId;
				result = btr.GetAllBlockReferenceIds(true)
					.Select(n => (BlockReference)tr.GetObject(n, OpenMode.ForRead))
					.Where(n => n.OwnerId == modelId)
					.Select(n => n.ObjectId)
					.ToList();
				tr.Commit();
			}
			return result;
		}
		
		/// <summary>
		/// Создание объекта границы чертежа
		/// Масштаб берётся из масштаба вхождения блока по оси X
		/// </summary>
		/// <param name="brefId">ObjectId вхождения блока рамки</param>
		/// <param name="name">Имя будущего листа</param>
		/// <returns>Объект границ чертежа</returns>
		private DrawingBorders CreateBorder(ObjectId brefId, string name)
		{
			DrawingBorders border = null;
			
			using (Transaction tr = _wdb.TransactionManager.StartTransaction())<commit_msg>Реализовал обработку предварительного выбора блоков<commit_after>﻿/*
 * User: aleksey.nakoryakov
 * Date: 13.05.13
 * Time: 14:39
 */
using System;
using System.Collections.Generic;
using System.Linq;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;

namespace LayoutsFromModel
{
	/// <summary>
	/// Класс, создающий коллекцию границ чертежей из вхождений блоков
	/// </summary>
	public class BlocksBordersBuilder : IBordersCollectionBuilder
	{
		private Database _wdb = HostApplicationServices.WorkingDatabase;
		
		public int InitialBorderIndex { get; set; }
		
		/// <summary>
		/// Получение границ из вхождений блоков
		/// </summary>
		/// <returns>Массив границ чертежей</returns>
		public DrawingBorders[] GetDrawingBorders()
		{
			List<DrawingBorders> borders = new List<DrawingBorders>();
			
			string blockname = Configuration.AppConfig.Instance.BlockName;
			if (string.IsNullOrEmpty(blockname))
				throw new System.Exception("Не задано имя блока рамки");
			
			using (Transaction tr = _wdb.TransactionManager.StartTransaction())
			{
				// Получаем коллекцию ObjectId вхождений блока blockname, затем сортируем
				// "построчно"
				IEnumerable<ObjectId> blockRefIds = null;
				BlockTable bt = (BlockTable)tr.GetObject(_wdb.BlockTableId, OpenMode.ForRead);
				if (!bt.Has(blockname))
					throw new ArgumentException("blockname");
				ObjectId btrId = bt[blockname];
				
				Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
				PromptSelectionResult res = ed.SelectImplied();
				if (res.Status == PromptStatus.OK)
				{
					blockRefIds = res.Value
						.GetObjectIds()
						.Where(id => id.ObjectClass.Name == "AcDbBlockReference")
						.Where(id => ((BlockReference)tr.GetObject(id, OpenMode.ForRead)).DynamicBlockTableRecord == btrId);
				}
				else
				{
					blockRefIds = GetBlockReferences(btrId);
				}
				
				blockRefIds = blockRefIds
					.Select(n => (BlockReference)tr.GetObject(n, OpenMode.ForRead))
					.OrderByDescending(n => n.Position.Y)
					.ThenBy(n => n.Position.X)
					.Select(n => n.ObjectId);
				
				int borderIndex = InitialBorderIndex;
				
				foreach (var brefId in blockRefIds)
				{
					string borderName = string.Format("{0}{1}{2}",
					                                  Configuration.AppConfig.Instance.Prefix,
					                                  borderIndex++,
					                                  Configuration.AppConfig.Instance.Suffix);
					borders.Add(CreateBorder(brefId, borderName));
				}
				tr.Commit();
			}
			
			return borders.ToArray();
		}
		
		private List<ObjectId> GetBlockReferences(ObjectId blockId)
		{
			List<ObjectId> result = null;
			using (Transaction tr = _wdb.TransactionManager.StartTransaction())
			{
				BlockTableRecord btr = (BlockTableRecord)tr.GetObject(blockId, OpenMode.ForRead);

				BlockTable bt = (BlockTable)tr.GetObject(_wdb.BlockTableId, OpenMode.ForRead);				
				ObjectId modelId = ((BlockTableRecord)tr
				                    .GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead)).ObjectId;
				
				result = btr.GetAllBlockReferenceIds(true)
					.Select(n => (BlockReference)tr.GetObject(n, OpenMode.ForRead))
					.Where(n => n.OwnerId == modelId)
					.Select(n => n.ObjectId)
					.ToList();
				tr.Commit();
			}
			return result;
		}
		
		/// <summary>
		/// Создание объекта границы чертежа
		/// Масштаб берётся из масштаба вхождения блока по оси X
		/// </summary>
		/// <param name="brefId">ObjectId вхождения блока рамки</param>
		/// <param name="name">Имя будущего листа</param>
		/// <returns>Объект границ чертежа</returns>
		private DrawingBorders CreateBorder(ObjectId brefId, string name)
		{
			DrawingBorders border = null;
			
			using (Transaction tr = _wdb.TransactionManager.StartTransaction())
{'fraction_non_alphanumeric': 0.11660675772825306, 'fraction_numerical': 0.003738317757009346, 'mean_word_length': 3.0965842167255593, 'pattern_counts': {'":': 0, '<': 40, '<?xml version=': 0, '>': 56, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 6, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1069665', 'n_tokens_mistral': 2676, 'n_tokens_neox': 2292, 'n_words': 431}