// Create a new schedule public ViewSchedule CreateSchedule(string filePath, UIDocument uidoc) { ViewSchedule sched = null; _doc = uidoc.Document; if (uidoc.Document.IsWorkshared) { docPath = ModelPathUtils.ConvertModelPathToUserVisiblePath(uidoc.Document.GetWorksharingCentralModelPath()); } else { docPath = uidoc.Document.PathName; } excelFilePath = filePath; if (File.Exists(excelFilePath)) { // read the Excel file and create the schedule Excel.Application excelApp = new Excel.Application(); Excel.Workbook workbook = excelApp.Workbooks.Open(excelFilePath, ReadOnly: true); Excel.Sheets worksheets = workbook.Worksheets; List <WorksheetObject> worksheetObjs = new List <WorksheetObject>(); foreach (Excel.Worksheet ws in worksheets) { WorksheetObject wo = new WorksheetObject(); string name = ws.Name; wo.Name = name; Excel.Range range = ws.UsedRange; try { range.CopyPicture(Excel.XlPictureAppearance.xlPrinter, Excel.XlCopyPictureFormat.xlBitmap); if (Clipboard.GetDataObject() != null) { IDataObject data = Clipboard.GetDataObject(); if (data.GetDataPresent(DataFormats.Bitmap)) { System.Drawing.Image img = (System.Drawing.Image)data.GetData(DataFormats.Bitmap, true); wo.Image = img; } } } catch { } worksheetObjs.Add(wo); } // Pop up the worksheet form WorksheetSelectForm wsForm = new WorksheetSelectForm(worksheetObjs, this, _doc); // Revit version int version = Convert.ToInt32(uidoc.Application.Application.VersionNumber); // Get the Revit window handle IntPtr handle = IntPtr.Zero; if (version < 2019) { handle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle; } else { handle = uidoc.Application.GetType().GetProperty("MainWindowHandle") != null ? (IntPtr)uidoc.Application.GetType().GetProperty("MainWindowHandle").GetValue(uidoc.Application) : IntPtr.Zero; } System.Windows.Interop.WindowInteropHelper wih = new System.Windows.Interop.WindowInteropHelper(wsForm) { Owner = handle }; //Show the Worksheet Select form wsForm.ShowDialog(); if (wsForm.DialogResult.HasValue && wsForm.DialogResult.Value) { foreach (Excel.Worksheet ws in worksheets) { if (ws.Name == selectedWorksheet.Name) { worksheet = ws; break; } } } else { worksheet = null; } if (worksheet != null) { workSheetName = worksheet.Name; Transaction trans = new Transaction(_doc, "Create Schedule"); trans.Start(); // Create the schedule sched = ViewSchedule.CreateSchedule(_doc, new ElementId(-1)); sched.Name = worksheet.Name; // Add a single parameter for data, Assembly Code ElementId assemblyCodeId = new ElementId(BuiltInParameter.UNIFORMAT_DESCRIPTION); ScheduleFieldId fieldId = null; foreach (SchedulableField sField in sched.Definition.GetSchedulableFields()) { ElementId paramId = sField.ParameterId; if (paramId == assemblyCodeId) { ScheduleField field = sched.Definition.AddField(sField); fieldId = field.FieldId; break; } } if (fieldId != null && sched.Definition.GetFieldCount() > 0) { ScheduleDefinition schedDef = sched.Definition; // Add filters to hide all elements in the schedule, ie make sure nothing shows up in the body. ScheduleFilter filter0 = new ScheduleFilter(fieldId, ScheduleFilterType.Equal, "NO VALUES FOUND"); ScheduleFilter filter1 = new ScheduleFilter(fieldId, ScheduleFilterType.Equal, "ALL VALUES FOUND"); schedDef.AddFilter(filter0); schedDef.AddFilter(filter1); // Turn off the headers schedDef.ShowHeaders = false; // Fill out the schedule from Excel data AddScheduleData(filePath, sched, _doc, PathType.Absolute, false); } if (linkFile) { AssignSchemaData(sched.Id, workSheetName, _doc); } trans.Commit(); } //workbook.Close(); workbook.Close(false); Marshal.ReleaseComObject(worksheets); if (worksheet != null) { Marshal.ReleaseComObject(worksheet); } Marshal.ReleaseComObject(workbook); excelApp.Quit(); Marshal.ReleaseComObject(excelApp); } return(sched); }
/// <summary> /// Create a schedule for a given property set. /// </summary> /// <param name="doc">The document.</param> /// <param name="element">The element being created.</param> /// <param name="category">The category of the element.</param> /// <param name="parameterGroupMap">The parameters of the element. Cached for performance.</param> /// <param name="parametersCreated">The created parameters.</param> protected void CreateScheduleForPropertySet(Document doc, Element element, Category category, IFCParameterSetByGroup parameterGroupMap, ISet <string> parametersCreated) { // Don't bother creating schedules if we are maximizing performance. if (IFCImportFile.TheFile.Options.UseStreamlinedOptions) { return; } if (parametersCreated.Count == 0) { return; } if (category == null) { return; } ElementId categoryId = category.Id; bool elementIsType = (element is ElementType); string cleanName = IFCNamingUtil.CleanIFCName(Name); Tuple <ElementId, bool, string> scheduleKey = Tuple.Create(categoryId, elementIsType, cleanName); ISet <string> viewScheduleNames = Importer.TheCache.ViewScheduleNames; IDictionary <Tuple <ElementId, bool, string>, ElementId> viewSchedules = Importer.TheCache.ViewSchedules; ElementId viewScheduleId; if (!viewSchedules.TryGetValue(scheduleKey, out viewScheduleId)) { string scheduleName = scheduleKey.Item3; string scheduleTypeName = elementIsType ? " " + Resources.IFCTypeSchedule : string.Empty; int index = 1; while (viewScheduleNames.Contains(scheduleName)) { string indexString = (index > 1) ? " " + index.ToString() : string.Empty; scheduleName += " (" + category.Name + scheduleTypeName + indexString + ")"; index++; if (index > 1000) { Importer.TheLog.LogWarning(Id, "Too many property sets with the name " + scheduleKey.Item3 + ", no longer creating schedules with that name.", true); return; } } // Not all categories allow creating schedules. Skip these. ViewSchedule viewSchedule = null; try { viewSchedule = ViewSchedule.CreateSchedule(doc, scheduleKey.Item1); } catch { // Only try to create the schedule once per key. viewSchedules[scheduleKey] = ElementId.InvalidElementId; return; } if (viewSchedule != null) { viewSchedule.Name = scheduleName; viewSchedules[scheduleKey] = viewSchedule.Id; viewScheduleNames.Add(scheduleName); ElementId ifcGUIDId = new ElementId(elementIsType ? BuiltInParameter.IFC_TYPE_GUID : BuiltInParameter.IFC_GUID); string propertySetListName = elementIsType ? Resources.IFCTypeSchedule + " IfcPropertySetList" : "IfcPropertySetList"; ScheduleDefinition viewScheduleDefinition = viewSchedule.Definition; IList <SchedulableField> schedulableFields = viewScheduleDefinition.GetSchedulableFields(); bool filtered = false; foreach (SchedulableField sf in schedulableFields) { string fieldName = sf.GetName(doc); if (parametersCreated.Contains(fieldName) || sf.ParameterId == ifcGUIDId) { viewScheduleDefinition.AddField(sf); } else if (!filtered && fieldName == propertySetListName) { // We want to filter the schedule for specifically those elements that have this property set assigned. ScheduleField scheduleField = viewScheduleDefinition.AddField(sf); scheduleField.IsHidden = true; ScheduleFilter filter = new ScheduleFilter(scheduleField.FieldId, ScheduleFilterType.Contains, "\"" + Name + "\""); viewScheduleDefinition.AddFilter(filter); filtered = true; } } } } return; }