Schöck
Показать сообщение отдельно
 
Непрочитано 05.08.2015, 15:48
4 | #5128
Wrath

Конструктор
 
Регистрация: 11.11.2011
Сообщений: 284


Мальчишки и девченки, а также их родители...)
Помнится мне, поднималась тема печати разньіх форматов...extraneous в своем блоге решал сию задачу с помощью динамо.
Вот, появилось у меня немного свободного времени, и я решил и сам чего-то смастерить.) Так, как с динамой у меня отношения натянутьіе, пришлось воспользоваться дедовскими методами.) Собственно, результат вот :
Код:
[Выделить все]
public void CreateViewSheetSetsList()
		{
			Document doc = this.ActiveUIDocument.Document;
			List<Element> titleBlockList = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_TitleBlocks).WhereElementIsNotElementType().ToList();
			List<View> sheetList = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Sheets).ToList().ConvertAll(e=>{return doc.GetElement(e.Id) as View;});
			SortedList<string,ViewSet> viewSheetSetsList = new SortedList<string, ViewSet>();
			foreach (Element e in titleBlockList)
			{
				Parameter s_number = e.get_Parameter(BuiltInParameter.SHEET_NUMBER);
				View sheet = sheetList.Where(v => v.get_Parameter(BuiltInParameter.SHEET_NUMBER).AsString() == s_number.AsString()).First();
				Parameter s_height = e.get_Parameter(BuiltInParameter.SHEET_HEIGHT);
				Parameter s_width  = e.get_Parameter(BuiltInParameter.SHEET_WIDTH);
				string s_format = GetSheetFormat(s_height.AsValueString(), s_width.AsValueString());
				
				if (viewSheetSetsList.Keys.Contains(s_format))
				{
					ViewSet vs = viewSheetSetsList.Values.ElementAt(viewSheetSetsList.Keys.IndexOf(s_format));
					vs.Insert(sheet);
				}
				else
				{
					ViewSet vs = new ViewSet();
					vs.Insert(sheet);
					viewSheetSetsList.Add(s_format, vs);
				}
			}
			using (TransactionGroup tg = new TransactionGroup(doc))
			{
				tg.Start("Sorting ViewSheets by format");
				using (Transaction tx1 = new Transaction(doc))
				{
					tx1.Start("Deleting existing ViewSheet Sets");
					List<ElementId> allViewSheetSetsIds = new FilteredElementCollector(doc).OfClass(typeof(ViewSheetSet)).ToElementIds().ToList();
					doc.Delete(allViewSheetSetsIds);
					tx1.Commit();
				}
				
				using (Transaction tx2 = new Transaction(doc))
				{
					tx2.Start("Creating new ViewSheet Sets");
					PrintManager pm = doc.PrintManager;
					pm.PrintRange = PrintRange.Select;
					ViewSheetSetting vss = pm.ViewSheetSetting;
					foreach (KeyValuePair<string,ViewSet> kvp in viewSheetSetsList)
					{
						vss.CurrentViewSheetSet.Views = kvp.Value;
						vss.SaveAs(kvp.Key);
					}
					tx2.Commit();
				}
				tg.Assimilate();
			}
		}
		
		private string GetSheetFormat(string height, string width)
		{
			string result = "";
			switch (width + "x" + height)
			{
				case "297x210" :
					result = "A4A";
					break;
				case "210x297" :
					result = "A4K";
					break;
				case "420x297" :
					result = "A3A";
					break;
				case "297x420" :
					result = "A3K";
					break;
				case "630x297" :
					result = "3A4K";
					break;
				case "594x420" :
					result = "A2A";
					break;
				case "420x594" :
					result = "A2K";
					break;
				case "841x594" :
					result = "A1A";
					break;
				case "594x841" :
					result = "A1K";
					break;
				default :
					result = "Unknown format";
				break;
			}
			return result;
		}
Проверил - вроде работает адекватно...
Для тех, кто не понял : єтот макрос сортирует листьі по формату и создает соответствующие списки, к которьім уже вручную следует применить свойства печати(кажется мне, что полная автоматизация не стоит потраченньіх на нее усилий). Список форматов во втором методе - можно править под себя, как, собственно, и весь код.)
Принимаются уведомлении об ошибках и предложения по оптимизации.)
Offtop: За корявость кода сильно не ругаться - я инженер, а не программист.)
Wrath вне форума  
 
Размещение рекламы