├── .gitignore ├── LICENSE.md ├── LayoutsFromModel.build ├── LayoutsFromModel.sln ├── LayoutsFromModel.smproj ├── LayoutsFromModel ├── BlocksBordersBuilder.cs ├── BorderDrawer.cs ├── BorderPromptResult.cs ├── CommandClass.cs ├── Configuration │ ├── AppConfig.cs │ ├── ConfigurationDialog.xaml │ ├── ConfigurationDialog.xaml.cs │ └── PrecisionValidationRule.cs ├── DrawingBorders.cs ├── Helpers │ └── AcadPreferencesHelper.cs ├── IBorderVisitor.cs ├── IBordersCollectionBuilder.cs ├── InitialUserInteraction.cs ├── LayoutCreator.cs ├── LayoutsFromModel.csproj ├── PlotSettingsInfo.cs ├── PlotSettingsInfoBuilder.cs ├── PlotSettingsManager.cs ├── PromptResultStatus.cs ├── Properties │ ├── AssemblyInfo.cs │ ├── CmdOptions.Designer.cs │ ├── CmdOptions.resx │ ├── CmdPrompts.Designer.cs │ ├── CmdPrompts.resx │ └── ErrorMessages.resx └── UserInputBordersBuilder.cs └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | #OS junk files 2 | [Tt]humbs.db 3 | *.DS_Store 4 | 5 | #Visual Studio files 6 | *.[Oo]bj 7 | *.user 8 | *.aps 9 | *.pch 10 | *.vspscc 11 | *.vssscc 12 | *_i.c 13 | *_p.c 14 | *.ncb 15 | *.suo 16 | *.tlb 17 | *.tlh 18 | *.bak 19 | *.[Cc]ache 20 | *.ilk 21 | *.log 22 | *.lib 23 | *.sbr 24 | *.sdf 25 | *.opensdf 26 | ipch/ 27 | obj/ 28 | [Bb]in 29 | [Dd]ebug*/ 30 | [Rr]elease*/ 31 | Ankh.NoLoad 32 | 33 | #Tooling 34 | _ReSharper*/ 35 | *.resharper 36 | [Tt]est[Rr]esult* 37 | 38 | #Project files 39 | [Bb]uild/ 40 | 41 | #Subversion files 42 | .svn 43 | 44 | # Office Temp Files 45 | ~$* -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Aleksey Nakoryakov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /LayoutsFromModel.build: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 28 | 29 | 30 | 31 | 33 | 34 | 35 | 36 | 37 | 42 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 58 | 59 | 60 | 61 | 62 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /LayoutsFromModel.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 11.00 3 | # Visual Studio 2010 4 | # SharpDevelop 4.2.1.8805 5 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2655139F-B74F-43F7-AF81-979D81EE583A}" 6 | ProjectSection(SolutionItems) = postProject 7 | LayoutsFromModel.build = LayoutsFromModel.build 8 | EndProjectSection 9 | EndProject 10 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LayoutsFromModel", "LayoutsFromModel\LayoutsFromModel.csproj", "{A1C752F5-8EF6-44A6-BFAD-C3948D05C452}" 11 | EndProject 12 | Global 13 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 14 | Debug|x86 = Debug|x86 15 | Release|x86 = Release|x86 16 | Debug|Any CPU = Debug|Any CPU 17 | Release|Any CPU = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 20 | {A1C752F5-8EF6-44A6-BFAD-C3948D05C452}.Debug|x86.Build.0 = Debug|x86 21 | {A1C752F5-8EF6-44A6-BFAD-C3948D05C452}.Debug|x86.ActiveCfg = Debug|x86 22 | {A1C752F5-8EF6-44A6-BFAD-C3948D05C452}.Release|x86.Build.0 = Release|x86 23 | {A1C752F5-8EF6-44A6-BFAD-C3948D05C452}.Release|x86.ActiveCfg = Release|x86 24 | {A1C752F5-8EF6-44A6-BFAD-C3948D05C452}.Debug|Any CPU.Build.0 = Debug|Any CPU 25 | {A1C752F5-8EF6-44A6-BFAD-C3948D05C452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 26 | {A1C752F5-8EF6-44A6-BFAD-C3948D05C452}.Release|Any CPU.Build.0 = Release|Any CPU 27 | {A1C752F5-8EF6-44A6-BFAD-C3948D05C452}.Release|Any CPU.ActiveCfg = Release|Any CPU 28 | EndGlobalSection 29 | EndGlobal 30 | -------------------------------------------------------------------------------- /LayoutsFromModel.smproj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bargool/LayoutsFromModel/28119de39c943a127b670c60efab2a6d3f10f3ab/LayoutsFromModel.smproj -------------------------------------------------------------------------------- /LayoutsFromModel/BlocksBordersBuilder.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * User: aleksey.nakoryakov 3 | * Date: 13.05.13 4 | * Time: 14:39 5 | */ 6 | using System; 7 | using System.Collections.Generic; 8 | using System.Linq; 9 | using Autodesk.AutoCAD.DatabaseServices; 10 | using Autodesk.AutoCAD.EditorInput; 11 | 12 | namespace LayoutsFromModel 13 | { 14 | /// 15 | /// Класс, создающий коллекцию границ чертежей из вхождений блоков 16 | /// 17 | public class BlocksBordersBuilder : IBordersCollectionBuilder 18 | { 19 | private Database _wdb = HostApplicationServices.WorkingDatabase; 20 | 21 | public int InitialBorderIndex { get; set; } 22 | 23 | /// 24 | /// Получение границ из вхождений блоков 25 | /// 26 | /// Массив границ чертежей 27 | public DrawingBorders[] GetDrawingBorders() 28 | { 29 | List borders = new List(); 30 | 31 | string blockname = GetBordersBlockName(); 32 | 33 | using (Transaction tr = _wdb.TransactionManager.StartTransaction()) 34 | { 35 | // Получаем коллекцию ObjectId вхождений блока blockname, затем сортируем 36 | // "построчно" 37 | IEnumerable blockRefIds = null; 38 | BlockTable bt = (BlockTable)tr.GetObject(_wdb.BlockTableId, OpenMode.ForRead); 39 | if (!bt.Has(blockname)) 40 | throw new ArgumentException("blockname"); 41 | ObjectId btrId = bt[blockname]; 42 | 43 | Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; 44 | PromptSelectionResult res = ed.SelectImplied(); 45 | if (res.Status == PromptStatus.OK) 46 | { 47 | blockRefIds = res.Value 48 | .GetObjectIds() 49 | .Where(id => id.ObjectClass.Name == "AcDbBlockReference") 50 | .Where(id => ((BlockReference)tr.GetObject(id, OpenMode.ForRead)).DynamicBlockTableRecord == btrId); 51 | } 52 | else 53 | { 54 | blockRefIds = GetBlockReferences(btrId); 55 | } 56 | 57 | blockRefIds = blockRefIds 58 | .Select(n => (BlockReference)tr.GetObject(n, OpenMode.ForRead)) 59 | .OrderByDescending(n => n.Position.Y) 60 | .ThenBy(n => n.Position.X) 61 | .Select(n => n.ObjectId); 62 | 63 | int borderIndex = InitialBorderIndex; 64 | 65 | foreach (var brefId in blockRefIds) 66 | { 67 | string borderName = string.Format("{0}{1}{2}", 68 | Configuration.AppConfig.Instance.Prefix, 69 | borderIndex++, 70 | Configuration.AppConfig.Instance.Suffix); 71 | borders.Add(CreateBorder(brefId, borderName)); 72 | } 73 | tr.Commit(); 74 | } 75 | 76 | return borders.ToArray(); 77 | } 78 | 79 | private string GetBordersBlockName() 80 | { 81 | string blockname = Configuration.AppConfig.Instance.BlockName; 82 | if (string.IsNullOrEmpty(blockname)) 83 | throw new System.Exception("Не задано имя блока рамки!"); 84 | return blockname; 85 | } 86 | 87 | private List GetBlockReferences(ObjectId blockId) 88 | { 89 | List result = null; 90 | using (Transaction tr = _wdb.TransactionManager.StartTransaction()) 91 | { 92 | BlockTableRecord btr = (BlockTableRecord)tr.GetObject(blockId, OpenMode.ForRead); 93 | 94 | BlockTable bt = (BlockTable)tr.GetObject(_wdb.BlockTableId, OpenMode.ForRead); 95 | ObjectId modelId = ((BlockTableRecord)tr 96 | .GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead)).ObjectId; 97 | 98 | result = btr.GetAllBlockReferenceIds(true) 99 | .Select(n => (BlockReference)tr.GetObject(n, OpenMode.ForRead)) 100 | .Where(n => n.OwnerId == modelId) 101 | .Select(n => n.ObjectId) 102 | .ToList(); 103 | tr.Commit(); 104 | } 105 | return result; 106 | } 107 | 108 | /// 109 | /// Создание объекта границы чертежа 110 | /// Масштаб берётся из масштаба вхождения блока по оси X 111 | /// 112 | /// ObjectId вхождения блока рамки 113 | /// Имя будущего листа 114 | /// Объект границ чертежа 115 | private DrawingBorders CreateBorder(ObjectId brefId, string name) 116 | { 117 | DrawingBorders border = null; 118 | 119 | using (Transaction tr = _wdb.TransactionManager.StartTransaction()) 120 | { 121 | BlockReference bref = (BlockReference)tr.GetObject(brefId, OpenMode.ForRead); 122 | double scale = bref.ScaleFactors.X; 123 | border = DrawingBorders.CreateDrawingBorders(bref.GeometricExtents.MinPoint, 124 | bref.GeometricExtents.MaxPoint, 125 | name, 126 | scale); 127 | tr.Commit(); 128 | } 129 | return border; 130 | } 131 | } 132 | 133 | public static class BlockTableRecordExtensions 134 | { 135 | public static IEnumerable GetAllBlockReferenceIds(this BlockTableRecord btr, bool directOnly) 136 | { 137 | IEnumerable brefIds = btr 138 | .GetBlockReferenceIds(directOnly, false) 139 | .Cast() 140 | .Concat( 141 | btr.GetAnonymousBlockIds() 142 | .Cast() 143 | .SelectMany( 144 | n => ((BlockTableRecord)n.GetObject(OpenMode.ForRead)) 145 | .GetBlockReferenceIds(directOnly, false) 146 | .Cast())); 147 | return brefIds; 148 | } 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /LayoutsFromModel/BorderDrawer.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * User: aleksey 3 | * Date: 01.05.2013 4 | * Time: 15:09 5 | */ 6 | using System; 7 | using System.Collections.Generic; 8 | 9 | using Autodesk.AutoCAD.Colors; 10 | using Autodesk.AutoCAD.Geometry; 11 | using Autodesk.AutoCAD.GraphicsInterface; 12 | using ADS = Autodesk.AutoCAD.DatabaseServices; 13 | 14 | namespace LayoutsFromModel 15 | { 16 | /// 17 | /// Посетитель, отрисовывающий временной графикой выбранные пользователем рамки. 18 | /// 19 | public class BorderDrawer : IBorderVisitor 20 | { 21 | List objects = new List(); 22 | Color graphicsColor = Color.FromColorIndex(ColorMethod.ByLayer, 20); 23 | 24 | public void DrawBorder(DrawingBorders border) 25 | { 26 | // Обводим рамку прямоугольником 27 | Drawable rec = CreateRectangle(border.First, border.Second); 28 | this.objects.Add(rec); 29 | TransientManager tm = TransientManager.CurrentTransientManager; 30 | tm.AddTransient(rec, TransientDrawingMode.Highlight, 128, new IntegerCollection()); 31 | 32 | // Вписываем в рамку название будущего листа и его формат 33 | Drawable txt = CreateLayoutNameMText(border.Center, border.Name, border.PSInfo.Name, border.ScaleFactor); 34 | this.objects.Add(txt); 35 | tm.AddTransient(txt, TransientDrawingMode.DirectShortTerm, 256, new IntegerCollection()); 36 | } 37 | 38 | private ADS.DBObject CreateRectangle(Point3d first, Point3d second) 39 | { 40 | ADS.Polyline pl = new ADS.Polyline(4); 41 | pl.Color = this.graphicsColor; 42 | double firstX = first.X; 43 | double secondX = second.X; 44 | double firstY = first.Y; 45 | double secondY = second.Y; 46 | pl.AddVertexAt(0, new Point2d(firstX, firstY), 0, 0, 0); 47 | pl.AddVertexAt(1, new Point2d(firstX, secondY), 0, 0, 0); 48 | pl.AddVertexAt(2, new Point2d(secondX, secondY), 0, 0, 0); 49 | pl.AddVertexAt(3, new Point2d(secondX, firstY), 0, 0, 0); 50 | pl.Closed = true; 51 | return pl; 52 | } 53 | 54 | private ADS.DBObject CreateLayoutNameMText(Point3d center, string name, string format, double scaleFactor) 55 | { 56 | ADS.MText mt = new ADS.MText(); 57 | mt.SetDatabaseDefaults(ADS.HostApplicationServices.WorkingDatabase); 58 | mt.BackgroundFillColor = this.graphicsColor; 59 | mt.BackgroundFill = true; 60 | mt.Contents = name + "\\P" + format; 61 | mt.TextHeight = 12 * scaleFactor; 62 | mt.Location = center; 63 | mt.Attachment = ADS.AttachmentPoint.MiddleCenter; 64 | return mt; 65 | } 66 | 67 | public void ClearData() 68 | { 69 | TransientManager tm = TransientManager.CurrentTransientManager; 70 | if (this.objects != null || this.objects.Count != 0) 71 | { 72 | tm.EraseTransients(TransientDrawingMode.Highlight, 128, new IntegerCollection()); 73 | tm.EraseTransients(TransientDrawingMode.DirectShortTerm, 256, new IntegerCollection()); 74 | foreach (Drawable obj in this.objects) 75 | obj.Dispose(); 76 | this.objects.Clear(); 77 | } 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /LayoutsFromModel/BorderPromptResult.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * User: aleksey.nakoryakov 3 | * Date: 07.05.13 4 | * Time: 17:04 5 | */ 6 | using System; 7 | using Autodesk.AutoCAD.Geometry; 8 | 9 | namespace LayoutsFromModel 10 | { 11 | /// 12 | /// Результат ввода пользователем рамки чертежа 13 | /// 14 | public struct BorderPromptResult 15 | { 16 | Point3d firstPoint; 17 | public Point3d FirstPoint { 18 | get { return firstPoint; } 19 | } 20 | 21 | Point3d secondPoint; 22 | public Point3d SecondPoint { 23 | get { return secondPoint; } 24 | } 25 | 26 | string stringResult; 27 | public string StringResult { 28 | get { return stringResult; } 29 | set { stringResult = value; } 30 | } 31 | 32 | PromptResultStatus queryStatus; 33 | public PromptResultStatus QueryStatus { 34 | get { return queryStatus; } 35 | set { queryStatus = value; } 36 | } 37 | 38 | public BorderPromptResult(Point3d firstPoint, Point3d secondPoint) 39 | { 40 | this.queryStatus = PromptResultStatus.OK; 41 | this.firstPoint = firstPoint; 42 | this.secondPoint = secondPoint; 43 | this.stringResult = ""; 44 | } 45 | 46 | public BorderPromptResult(string stringResult) 47 | { 48 | this.queryStatus = PromptResultStatus.Keyword; 49 | this.stringResult = stringResult; 50 | this.firstPoint = Point3d.Origin; 51 | this.secondPoint = Point3d.Origin; 52 | } 53 | 54 | public BorderPromptResult(PromptResultStatus queryStatus) 55 | { 56 | this.queryStatus = queryStatus; 57 | this.firstPoint = Point3d.Origin; 58 | this.secondPoint = Point3d.Origin; 59 | this.stringResult = ""; 60 | } 61 | } 62 | } -------------------------------------------------------------------------------- /LayoutsFromModel/CommandClass.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * User: aleksey.nakoryakov 3 | * Date: 06.03.12 4 | * Time: 18:05 5 | */ 6 | //Microsoft 7 | using System; 8 | 9 | //Autodesk 10 | using Autodesk.AutoCAD.Runtime; 11 | using acad = Autodesk.AutoCAD.ApplicationServices.Application; 12 | 13 | [assembly:CommandClass(typeof(LayoutsFromModel.CommandClass))] 14 | 15 | namespace LayoutsFromModel 16 | { 17 | /// 18 | /// Данный класс содержит методы для непосредственной работы с AutoCAD 19 | /// 20 | public class CommandClass 21 | { 22 | [CommandMethodAttribute("bargLFM", CommandFlags.Modal|CommandFlags.NoPaperSpace)] 23 | [CommandMethodAttribute("LFM", CommandFlags.Modal|CommandFlags.NoPaperSpace)] 24 | public void LayoutFromUserInput() 25 | { 26 | CreateLayouts(new UserInputBordersBuilder()); 27 | } 28 | 29 | [CommandMethod("bargLFBL", CommandFlags.Modal|CommandFlags.NoPaperSpace|CommandFlags.UsePickSet)] 30 | public void LayoutFromBlocks() 31 | { 32 | CreateLayouts(new BlocksBordersBuilder()); 33 | } 34 | 35 | private void CreateLayouts(IBordersCollectionBuilder bordersBuilder) 36 | { 37 | InitialUserInteraction initial = new InitialUserInteraction(); 38 | initial.GetInitialData(); 39 | if (initial.InitialDataStatus == PromptResultStatus.Cancelled) 40 | return; 41 | initial.FillPlotInfoManager(); 42 | bordersBuilder.InitialBorderIndex = initial.Index; 43 | DrawingBorders[] borders = bordersBuilder.GetDrawingBorders(); 44 | if (borders.Length == 0) 45 | { 46 | acad.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\nНе выбран ни один чертёж"); 47 | return; 48 | } 49 | LayoutCreator layoutCreator = new LayoutCreator(); 50 | foreach (DrawingBorders border in borders) 51 | { 52 | layoutCreator.CreateLayout(border); 53 | } 54 | 55 | Configuration.AppConfig cfg = Configuration.AppConfig.Instance; 56 | // Если в конфигурации отмечено "возвращаться в модель" - то переходим в модель 57 | if (cfg.TilemodeOn) 58 | acad.SetSystemVariable("TILEMODE", 1); 59 | 60 | // Если в конфигурации отмечено "удалять неинициализированные листы" - удаляем их 61 | if (cfg.DeleteNonInitializedLayouts) 62 | { 63 | layoutCreator.DeleteNoninitializedLayouts(); 64 | acad.DocumentManager.MdiActiveDocument.Editor.Regen(); 65 | } 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /LayoutsFromModel/Configuration/AppConfig.cs: -------------------------------------------------------------------------------- 1 | /* 2 | * User: aleksey.nakoryakov 3 | * Date: 08/01/2012 4 | * Time: 13:58 5 | */ 6 | using System; 7 | using System.ComponentModel; 8 | using System.IO; 9 | using System.Reflection; 10 | using System.Runtime.Serialization; 11 | using System.Windows; 12 | using System.Xml.Serialization; 13 | 14 | namespace LayoutsFromModel.Configuration 15 | { 16 | /// 17 | /// Класс, представляющий конфигурацию приложения 18 | /// 19 | [Serializable] 20 | public sealed class AppConfig 21 | { 22 | string prefix = "Lay"; 23 | /// 24 | /// Префикс имени Layout 25 | /// 26 | public string Prefix { 27 | get { return prefix; } 28 | set { prefix = value; } 29 | } 30 | 31 | string suffix = ""; 32 | /// 33 | /// Суффикс имени Layout 34 | /// 35 | public string Suffix { 36 | get { return suffix; } 37 | set { suffix = value; } 38 | } 39 | 40 | int precision = 10; 41 | /// 42 | /// Точность определения формата бумаги 43 | /// 44 | public int Precision { 45 | get { return precision; } 46 | set { precision = value; } 47 | } 48 | 49 | bool deleteNonInitializedLayouts = false; 50 | /// 51 | /// Удалять ли неинициализированные листы 52 | /// 53 | public bool DeleteNonInitializedLayouts { 54 | get { return deleteNonInitializedLayouts; } 55 | set { deleteNonInitializedLayouts = value; } 56 | } 57 | 58 | double referenceDimension = 185.0; 59 | /// 60 | /// Эталонный размер. Используется для определения масштаба чертежа при 61 | /// выборе пользователем. По-умолчанию - длина основной надписи 62 | /// 63 | public double ReferenceDimension { 64 | get { return referenceDimension; } 65 | set { referenceDimension = value; } 66 | } 67 | 68 | bool tilemodeOn = true; 69 | /// 70 | /// Возвращаться ли в модель по окончанию созданию листов 71 | /// 72 | public bool TilemodeOn { 73 | get { return tilemodeOn; } 74 | set { tilemodeOn = value; } 75 | } 76 | 77 | string templatePath = ""; 78 | /// 79 | /// Путь к шаблону с именованными настройками печати 80 | /// 81 | public string TemplatePath { 82 | get { return templatePath; } 83 | set { templatePath = value; } 84 | } 85 | 86 | string blockName = ""; 87 | /// 88 | /// Имя блока рамки 89 | /// 90 | public string BlockName { 91 | get { return blockName; } 92 | set { blockName = value; } 93 | } 94 | 95 | bool lockViewPorts = false; 96 | /// 97 | /// Блокирование видовых экранов 98 | /// 99 | public bool LockViewPorts { 100 | get { return lockViewPorts; } 101 | set { lockViewPorts = value; } 102 | } 103 | 104 | const string FILENAME = "lfmsettings.xml"; // Имя файла конфигурации 105 | // Полный путь к файлу конфигурации 106 | private static string SettingsFile 107 | { 108 | get 109 | { 110 | return Path.Combine(Path.GetDirectoryName( 111 | Assembly.GetAssembly(typeof(AppConfig)) 112 | .Location), FILENAME); 113 | } 114 | } 115 | 116 | 117 | private static AppConfig instance = Load(); 118 | 119 | public static AppConfig Instance { 120 | get { return instance; } 121 | } 122 | 123 | private AppConfig() 124 | {} 125 | 126 | /// 127 | /// Сохранение конфигурации в файл 128 | /// 129 | public void Save() 130 | { 131 | using (Stream stream = File.Create(SettingsFile)) 132 | { 133 | XmlSerializer ser = new XmlSerializer(this.GetType()); 134 | ser.Serialize(stream, this); 135 | } 136 | } 137 | 138 | /// 139 | /// Загрузка конфигурации из файла 140 | /// 141 | /// 142 | private static AppConfig Load() 143 | { 144 | if (!File.Exists(SettingsFile)) 145 | return new AppConfig(); 146 | using (Stream stream = File.OpenRead(SettingsFile)) 147 | { 148 | try 149 | { 150 | XmlSerializer ser = new XmlSerializer(typeof(AppConfig)); 151 | return (AppConfig)ser.Deserialize(stream); 152 | } 153 | catch (InvalidOperationException) 154 | { 155 | stream.Close(); 156 | File.Delete(SettingsFile); 157 | return new AppConfig(); 158 | } 159 | } 160 | } 161 | 162 | /// 163 | /// Метод вызывает диалог конфигурации и изменяет настройки в зависимости от результата вызова 164 | /// 165 | public void ShowDialog() 166 | { 167 | ConfigurationDialog win = new ConfigurationDialog(Prefix, Suffix, 168 | Precision,DeleteNonInitializedLayouts, 169 | ReferenceDimension, 170 | TilemodeOn, 171 | BlockName, 172 | LockViewPorts); 173 | win.ShowDialog(); 174 | if (true == win.DialogResult) 175 | { 176 | this.Prefix = win.Prefix; 177 | this.Suffix = win.Suffix; 178 | this.Precision = win.Precision??new AppConfig().Precision; 179 | this.DeleteNonInitializedLayouts = win.DelNonInitializedLayouts; 180 | this.TilemodeOn = win.TilemodeOn; 181 | this.BlockName = win.BlockName; 182 | this.LockViewPorts = win.LockViewPorts; 183 | Save(); 184 | } 185 | } 186 | 187 | public bool TemplateExists() 188 | { 189 | return !string.IsNullOrEmpty(this.TemplatePath)&&File.Exists(this.TemplatePath); 190 | } 191 | 192 | public override string ToString() 193 | { 194 | return string.Format( 195 | "[Configuration Prefix={0}, Suffix={1}, Precision={2}, DeleteNonInitializedLayouts={3}, ReferenceDimension={4}, TilemodeOn={5}]", 196 | Prefix, Suffix, Precision, DeleteNonInitializedLayouts, ReferenceDimension, TilemodeOn); 197 | } 198 | } 199 | } -------------------------------------------------------------------------------- /LayoutsFromModel/Configuration/ConfigurationDialog.xaml: -------------------------------------------------------------------------------- 1 |  8 | 9 | 21 | 25 | 28 | 29 | 30 | 31 | 68 | 69 |