public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { Debug.Listeners.Clear(); Debug.Listeners.Add(new RbsLogger.Logger("RebarSketch")); Debug.WriteLine("Start rebar scetch, revit version" + commandData.Application.Application.VersionName); Document doc = commandData.Application.ActiveUIDocument.Document; Debug.WriteLine("Read settings"); //считываем файл настроек string activateMessage = SupportSettings.Activate(); if (!string.IsNullOrEmpty(activateMessage)) { message = activateMessage; Debug.WriteLine("Read settings failed: " + message); return(Result.Failed); } Debug.WriteLine("Read settings success"); //выбираем арматуру, которую будем обрабатывать Autodesk.Revit.UI.Selection.Selection sel = commandData.Application.ActiveUIDocument.Selection; List <ElementId> selIds = sel.GetElementIds().ToList(); //bool checkSelectionRebar = true; if (selIds.Count == 0) { message = "Перед запуском перейдите в Ведомость деталей, выберите все строчки и после этого запускайте плагин."; Debug.WriteLine("No selected elements"); return(Result.Failed); } if (selIds.Count > 0) { ElementId selId = selIds.First(); Element selElem = doc.GetElement(selId); if (selElem.Category.Id.IntegerValue != new ElementId(BuiltInCategory.OST_Rebar).IntegerValue) { message = "Перед запуском перейдите в Ведомость деталей, выберите все строчки и после этого запускайте плагин."; Debug.WriteLine("No selected rebar elements"); return(Result.Failed); } } List <Element> col = new List <Element>(); foreach (ElementId rebarId in selIds) { Element elem = doc.GetElement(rebarId); col.Add(elem); } View activeView = commandData.Application.ActiveUIDocument.ActiveView; ViewSchedule vs = activeView as ViewSchedule; if (vs == null) { message = "Перед запуском перейдите в Ведомость деталей, выберите все строчки и после этого запускайте плагин."; Debug.WriteLine("Active view is not ViewSchedule"); return(Result.Failed); } //очищаю ранее созданные картинки для данной ведомости деталей string imagesPrefix = vs.Id.IntegerValue.ToString(); List <ElementId> oldImageIds = new FilteredElementCollector(doc) .WhereElementIsElementType() .OfClass(typeof(ImageType)) .Where(i => i.Name.StartsWith(imagesPrefix)) .Select(i => i.Id) .ToList(); Debug.WriteLine("Old scetch images found: " + oldImageIds.Count.ToString()); if (oldImageIds.Count > 0) { using (Transaction t1 = new Transaction(doc)) { t1.Start("Очистка"); doc.Delete(oldImageIds); t1.Commit(); } } ScetchLibrary lib = new ScetchLibrary(); lib.Activate(SupportSettings.libraryPath); System.IO.Directory.CreateDirectory(SupportSettings.tempPath); Debug.WriteLine("Create temp folder: " + SupportSettings.tempPath); //разделяю арматуру на обычную и переменной длины List <Element> standartRebars = new List <Element>(); List <Element> variableRebars = new List <Element>(); foreach (Element rebar in col) { int checkIsVariable = RebarSketch.ScetchTemplate.CheckrebarIsVariableLength(rebar); if (checkIsVariable == -1) { continue; } if (checkIsVariable == 0) { standartRebars.Add(rebar); } else { variableRebars.Add(rebar); } } Debug.WriteLine("Standart rebars: " + standartRebars.Count.ToString() + ", variable rebars: " + variableRebars.Count.ToString()); //группировка арматуры переменной длины по марке Dictionary <string, List <Element> > variableRebarBase = new Dictionary <string, List <Element> >(); foreach (Element vRebar in variableRebars) { string mark = vRebar.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).AsString(); if (mark == null) { string msg = "Обнаружены арматурные стержни переменной длины, для которых не назначена Марки. "; msg += "Группировка для таких стержней выполняется по Марке, которую нужно назначить заранее."; Debug.WriteLine("Non-marked variable rebars is found"); TaskDialog.Show("Ошибка", msg); return(Result.Failed); } if (variableRebarBase.ContainsKey(mark)) { variableRebarBase[mark].Add(vRebar); } else { variableRebarBase.Add(mark, new List <Element> { vRebar }); } } Dictionary <string, ScetchImage> imagesBase = new Dictionary <string, ScetchImage>(); HashSet <string> errorRebarNames = new HashSet <string>(); using (Transaction t2 = new Transaction(doc)) { t2.Start("Ведомость деталей"); //заполняю картинки для обычной арматуры foreach (Element rebar in standartRebars) { string formName = ScetchTemplate.GetFormNameByElement(rebar); if (formName == "") { continue; } ScetchTemplate st = lib.GetTemlateByFamilyName(formName, rebar); if (st == null) { errorRebarNames.Add(formName); continue; //return Result.Failed; } //для арматуры округляем размеры, для закладных деталей (класс арматуры меньше нуля) - нет bool roundForSmallDimension = SupportMath.CheckNeedsRoundSmallDimension(rebar); foreach (ScetchParameter sparam in st.parameters) { string paramName = sparam.Name; Parameter lengthParam = rebar.LookupParameter(paramName); if (lengthParam == null) { message = "Параметр " + paramName + " не найден в " + SupportNames.GetElementName(rebar) + ". Возможно, нужно обновить семейство."; Debug.WriteLine(message); return(Result.Failed); } string textVal = lengthParam.Definition.Name; double val = lengthParam.AsDouble(); #if R2022 ForgeTypeId forgeType = lengthParam.GetUnitTypeId(); string unittype = forgeType.TypeId; bool isMillimeters = unittype.Contains("millimeters"); bool isDegrees = unittype.Contains("degrees"); #else bool isMillimeters = lengthParam.DisplayUnitType == DisplayUnitType.DUT_MILLIMETERS; bool isDegrees = lengthParam.DisplayUnitType == DisplayUnitType.DUT_DECIMAL_DEGREES; #endif if (isDegrees) { val = SupportMath.RoundDegrees(val); textVal = val.ToString("F0") + "°"; sparam.value = textVal; } else { val = SupportMath.RoundMillimeters(val, roundForSmallDimension); textVal = val.ToString("F0"); sparam.value = textVal; } Debug.WriteLine("ScetchParameter name " + sparam.Name + " value = " + textVal); } ScetchLibrary.SearchAndApplyScetch(imagesBase, rebar, st, imagesPrefix); } //заполняю картинки для арматуры переменной длины foreach (var kvp in variableRebarBase) { string mark = kvp.Key; List <Element> rebars = kvp.Value; bool roundForSmallDimension = SupportMath.CheckNeedsRoundSmallDimension(rebars.First()); string formName = ScetchTemplate.GetFormNameByElement(rebars.First()); ScetchTemplate st = lib.GetTemlateByFamilyName(formName, rebars.First()); if (st == null) { errorRebarNames.Add(formName); continue; } //получаю для каждого имени параметра список его возможных значений Dictionary <string, HashSet <double> > variableValues = new Dictionary <string, HashSet <double> >(); foreach (Element rebar in rebars) { foreach (ScetchParameter sparam in st.parameters) { string paramName = sparam.Name; Parameter lengthParam = rebar.LookupParameter(paramName); if (lengthParam == null) { message = "Параметр " + paramName + " не найден в " + SupportNames.GetElementName(rebar) + ". Возможно, попытка свести в одну позицию стержни разной формы. " + ". При использовании арматуры \"Переменной длины\" следует вручную назначить разные \"Марки\" для стержней разных позиций."; Debug.WriteLine("No found parameter " + paramName + " in element " + rebar.Id.IntegerValue.ToString()); return(Result.Failed); } double val = rebar.LookupParameter(paramName).AsDouble(); if (variableValues.ContainsKey(paramName)) { variableValues[paramName].Add(val); } else { variableValues.Add(paramName, new HashSet <double> { val }); } Debug.WriteLine("Add variableValues " + paramName + " = " + val.ToString()); } } foreach (ScetchParameter sparam in st.parameters) { string paramName = sparam.Name; HashSet <double> values = variableValues[paramName]; int count = values.Count(); double minValue = values.Min(); minValue = SupportMath.RoundMillimeters(minValue, roundForSmallDimension); double maxValue = values.Max(); maxValue = SupportMath.RoundMillimeters(maxValue, roundForSmallDimension); double spacing = (maxValue - minValue) / (count - 1); spacing = SupportSettings.lengthAccuracy * Math.Round(spacing / SupportSettings.lengthAccuracy); //Math.Round(spacing, 0); string line = ""; if (minValue == maxValue || count == 1) { sparam.value = minValue.ToString("F0"); sparam.IsVariable = false; sparam.HaveSpacing = false; } else { if (count == 2) { sparam.value = minValue.ToString("F0") + "..." + maxValue.ToString("F0"); sparam.IsVariable = true; sparam.HaveSpacing = false; } else { //sparam.value = minValue.ToString("F0") + "..." + maxValue.ToString("F0") + " (ш." + spacing.ToString("F0") + ")"; sparam.value = minValue.ToString("F0") + "..." + maxValue.ToString("F0"); sparam.HaveSpacing = true; sparam.IsVariable = true; sparam.SpacingValue = "ш." + spacing.ToString("F0"); } } } foreach (Element rebar in rebars) { Debug.WriteLine("Processed rebar id " + rebar.Id.IntegerValue.ToString()); ScetchImage si = new ScetchImage(rebar, st); ScetchLibrary.SearchAndApplyScetch(imagesBase, rebar, st, imagesPrefix); } } t2.Commit(); } FileSupport.CheckAndDeleteFolder(SupportSettings.tempPath); if (errorRebarNames.Count > 0) { string errorFamilyMessage = "Не удалось обработать семейства. Скорее всего, применены семейства не из библиотеки семейства. Имена семейств: "; foreach (string fam in errorRebarNames) { errorFamilyMessage = errorFamilyMessage + fam + "; "; } Debug.WriteLine(errorFamilyMessage); TaskDialog.Show("Отчет", errorFamilyMessage); } Debug.WriteLine("Scetches finish success"); return(Result.Succeeded); }
public static string Activate() { string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().Location; string assemblyFolder = System.IO.Path.GetDirectoryName(assemblyName); string appdataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); string bimstarterFolder = System.IO.Path.Combine(appdataFolder, "bim-starter"); if (!System.IO.Directory.Exists(bimstarterFolder)) { Debug.WriteLine("Create folder: " + bimstarterFolder); System.IO.Directory.CreateDirectory(bimstarterFolder); } configFilePath = Path.Combine(bimstarterFolder, "config.ini"); string weandrevitPath = ""; if (File.Exists(configFilePath)) { Debug.WriteLine("Read file: " + configFilePath); weandrevitPath = File.ReadAllLines(configFilePath)[0]; } else { Debug.WriteLine("First start, show dialog window and select config folder"); string configDefaultFolder = Path.Combine(appdataFolder, @"Autodesk\Revit\Addins\20xx\BimStarter"); FormSelectPath form = new FormSelectPath(configFilePath, configDefaultFolder); if (form.ShowDialog() != System.Windows.Forms.DialogResult.OK) { return("Cancelled"); } if (form.UseServerPath) { weandrevitPath = form.ServerPath; } else { weandrevitPath = configDefaultFolder; } Debug.WriteLine("Selected user path: " + weandrevitPath); File.WriteAllText(configFilePath, weandrevitPath); Debug.WriteLine("Written to file: " + configFilePath); } libraryPath = Path.Combine(weandrevitPath, "RebarSketch", "library"); Debug.WriteLine("Library path: " + libraryPath); if (!Directory.Exists(libraryPath)) { return("Library directory not exists: " + libraryPath); } string settingsFile = Path.Combine(weandrevitPath, "RebarSketch", "settings.txt"); Debug.WriteLine("Settings path: " + settingsFile); if (!File.Exists(settingsFile)) { Debug.WriteLine("File not found: " + settingsFile); throw new Exception("File not found: " + settingsFile); } string[] settings = FileSupport.ReadFileWithAnyDecoding(settingsFile); fontName = settings[0].Split('#').Last(); fontSize = float.Parse(settings[1].Split('#').Last()); string textStyle = settings[2].Split('#').Last(); fontStyle = FileSupport.GetFontStyle(textStyle); lengthAccuracy = double.Parse(settings[3].Split('#').Last()); tempPath = settings[4].Split('#').Last(); imageParamName = settings[5].Split('#').Last(); FileSupport.CheckAndDeleteFolder(tempPath); Debug.WriteLine("Settings activate success"); return(string.Empty); }
private ScetchTemplate CreateTemplate(string nameFolder, bool AsSubtype) { string name = nameFolder.Split('\\').Last(); ScetchTemplate st = new ScetchTemplate(); st.formName = name; if (AsSubtype) { st.IsSubtype = true; string subtypeNumberString = name.Split('_').Last(); int subtypeNumber = int.Parse(subtypeNumberString); st.SubtypeNumber = subtypeNumber; } string familiesNamesFile = Path.Combine(nameFolder, "families.txt"); string fileCheck = CheckFileExists(familiesNamesFile); if (fileCheck != "") { Autodesk.Revit.UI.TaskDialog.Show("Ошибка", fileCheck); return(null); } string[] familiesNames = FileSupport.ReadFileWithAnyDecoding(familiesNamesFile); st.familyNames = familiesNames.ToList(); string imageFile = Path.Combine(nameFolder, "scetch.png"); fileCheck = CheckFileExists(imageFile); if (fileCheck != "") { Autodesk.Revit.UI.TaskDialog.Show("Ошибка", fileCheck); return(null); } st.templateImagePath = imageFile; string paramsFile = Path.Combine(nameFolder, "parameters.txt"); fileCheck = CheckFileExists(paramsFile); if (fileCheck != "") { Autodesk.Revit.UI.TaskDialog.Show("Ошибка", fileCheck); return(null); } string[] paramsArray = FileSupport.ReadFileWithAnyDecoding(paramsFile); st.parameters = new List <ScetchParameter>(); for (int i = 0; i < paramsArray.Length; i++) { string p = paramsArray[i]; if (p.StartsWith("#")) { continue; } ScetchParameter sp = new ScetchParameter(); string[] paramInfo = p.Split(','); if (paramInfo.Length < 4) { continue; } sp.Name = paramInfo[0]; bool checkParseX = float.TryParse(paramInfo[1], out sp.PositionX); bool checkParseY = float.TryParse(paramInfo[2], out sp.PositionY); bool checkParseR = float.TryParse(paramInfo[3], out sp.Rotation); if (!checkParseX || !checkParseY || !checkParseR) { throw new ArgumentException("Incorrect syntax in file " + paramsFile.Replace("\\", " \\") + ", line " + i); } sp.NeedsWrap = false; if (paramInfo.Length > 4) { if (paramInfo[4] == "1") { sp.NeedsWrap = true; } } st.parameters.Add(sp); } Debug.WriteLine("ScetchTemplate is created"); return(st); }
private void btnLoadTemplate_Click(object sender, EventArgs e) { bool checkDialog = this.LoadAndActivatePicture(); if (!checkDialog) { return; } dataGridView1.Rows.Clear(); string paramsFile = System.IO.Path.Combine(executionFolder, "parameters.txt"); bool check = System.IO.File.Exists(paramsFile); if (!check) { throw new Exception("Файл параметров не найден в папке с картинкой"); } ScetchTemplate st = new ScetchTemplate(); string[] paramsArray = FileSupport.ReadFileWithAnyDecoding(paramsFile); st.parameters = new List <ScetchParameter>(); for (int i = 0; i < paramsArray.Length; i++) { string p = paramsArray[i]; if (p.StartsWith("#")) { continue; } if (p.Length < 1) { continue; } string[] paramInfo = p.Split(','); if (paramInfo.Length < 4) { throw new Exception("Incorrect syntax in file " + paramsFile + ", line " + i); } string paramName = paramInfo[0]; string posX = paramInfo[1]; string posY = paramInfo[2]; string r = paramInfo[3]; bool needsWrap = false; if (paramInfo.Length > 4) { if (paramInfo[4] == "1") { needsWrap = true; } } dataGridView1.Rows.Add(paramName, paramName, posX, posY, r, needsWrap); } this.RefreshImage(); btnDeleteRow.Enabled = true; }