Beispiel #1
0
        public ScetchImage(Element elem, ScetchTemplate template)
        {
            Elem     = elem;
            Template = template;
            ImageKey = template.formName;

            roundForSmallDimension = SupportMath.CheckNeedsRoundSmallDimension(elem);

            foreach (ScetchParameter param in Template.parameters)
            {
                string paramName = param.Name;
                string textvalue = param.value;
                ImageKey += "#" + paramName + "~" + textvalue;
                //заменил = на ~, потому что иначе не подгружаются картинки при экспорте в dwg
            }
        }
Beispiel #2
0
 public void Activate(string libraryPath)
 {
     Debug.WriteLine("Scetch library activation start");
     templates = new List <ScetchTemplate>();
     string[] nameFolders = Directory.GetDirectories(libraryPath);
     Debug.WriteLine("Folders found: " + nameFolders.Length.ToString());
     foreach (string nameFolder in nameFolders)
     {
         Debug.WriteLine("Check folder: " + nameFolder);
         string[] subFolders = System.IO.Directory.GetDirectories(nameFolder);
         if (subFolders.Length == 0)
         {
             Debug.WriteLine("No subfolders, create scetch template");
             ScetchTemplate st = CreateTemplate(nameFolder, false);
             if (st == null)
             {
                 Debug.WriteLine("Scetch is null");
                 continue;
             }
             templates.Add(st);
             Debug.WriteLine("Scetch succesfuly added to library as form name: " + st.formName);
         }
         else
         {
             Debug.WriteLine("Subfolders found");
             foreach (string subfolder in subFolders)
             {
                 Debug.WriteLine("Create template by subfolder: " + subfolder);
                 ScetchTemplate st2 = CreateTemplate(subfolder, true);
                 if (st2 == null)
                 {
                     Debug.WriteLine("Scetch is null");
                     continue;
                 }
                 templates.Add(st2);
                 Debug.WriteLine("Scetch succesfuly added to library as form name: " + st2.formName);
             }
         }
     }
     Debug.WriteLine("Scetch library activation start");
 }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        public static void SearchAndApplyScetch(Dictionary <string, ScetchImage> imagesBase, Element rebar, ScetchTemplate st, string imagesPrefix)
        {
            Debug.WriteLine("Try to apply scetch for rebar id" + rebar.Id.IntegerValue.ToString());
            Document    doc            = rebar.Document;
            string      imageParamName = SupportSettings.imageParamName;
            ScetchImage si             = new ScetchImage(rebar, st);
            ImageType   imType2        = null;

            Debug.WriteLine("Key: " + si.ImageKey);

            if (imagesBase.ContainsKey(si.ImageKey)) //такая картинка уже ранее генерировалась и есть в проекте
            {
                Debug.WriteLine("Scetch exists, get from base");
                var baseImage = imagesBase[si.ImageKey];
                rebar.LookupParameter(imageParamName).Set(baseImage.imageType.Id);
                Debug.WriteLine("Set imagetype id" + baseImage.imageType.Id.IntegerValue.ToString() + " to rebar id" + rebar.Id.IntegerValue.ToString());
            }
            else //такая картинка еще не генерировалась - генерируем, добавляем в базу
            {
                si.Generate(imagesPrefix);
#if R2017 || R2018 || R2019
                imType2 = ImageType.Create(doc, si.ScetchImagePath);
#elif R2020
                imType2 = ImageType.Create(doc, new ImageTypeOptions(si.ScetchImagePath));
#elif R2021 || R2022
                ImageTypeOptions ito = new ImageTypeOptions(si.ScetchImagePath, false, ImageTypeSource.Import);
                imType2 = ImageType.Create(doc, ito);
#endif
                Debug.WriteLine("Create imagetype id=" + imType2.Id.IntegerValue.ToString());
                Parameter imageparam = rebar.LookupParameter(imageParamName);
                if (imageparam == null)
                {
                    string msg = "Нет параметра " + imageParamName + " в элементе id" + rebar.Id.IntegerValue.ToString();
                    Debug.WriteLine(msg);
                    System.Windows.Forms.MessageBox.Show(msg);
                    throw new Exception(msg);
                }
                if (imageparam.StorageType != StorageType.ElementId)
                {
                    string msg = "Неверный тип параметра " + imageParamName;
                    Debug.WriteLine(msg);
                    System.Windows.Forms.MessageBox.Show(msg);
                    System.Environment.Exit(1);
                }
                imageparam.Set(imType2.Id);
                si.imageType = imType2;
                imagesBase.Add(si.ImageKey, si);
                Debug.WriteLine("Scetch is created, ImageType id=" + imType2.Id.IntegerValue.ToString());
            }
        }
Beispiel #6
0
        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;
        }