public static void Upload(DocProject docProject, BackgroundWorker worker, string baseurl, string username, string password, string parentid, DocModelView[] docViews) { string sessionid = Connect(docProject, worker, baseurl, username, password); #if false if (docViews != null && docViews.Length > 0) { foreach (DocModelView docView in docViews)//docProject.ModelViews) { // hack: only bridge view for now if (docView.Name.Contains("Bridge")) { string codename = docView.Name; if (!String.IsNullOrEmpty(docView.Code)) { codename = docView.Code; } IfdBase ifdView = CreateConcept(baseurl, sessionid, docView, codename, docView.Name, IfdConceptTypeEnum.BAG); //CreateRelationship(baseurl, sessionid, parentid, ifdView.guid, "COLLECTS"); // no top-level item for now foreach (DocConceptRoot docRoot in docView.ConceptRoots) { if (docRoot.Name != null) { System.Diagnostics.Debug.WriteLine(docRoot.ToString()); IfdBase ifdRoot = CreateConcept(baseurl, sessionid, docRoot, docRoot.ApplicableEntity.Name, docRoot.Name, IfdConceptTypeEnum.SUBJECT); CreateRelationship(baseurl, sessionid, ifdView.guid, ifdRoot.guid, IfdRelationshipTypeEnum.COLLECTS); foreach (DocTemplateUsage docConc in docRoot.Concepts) { UploadTemplateUsage(docProject, baseurl, sessionid, ifdRoot.guid, docConc); } } } } } } else #endif { // build list of types referenced by property sets Dictionary <string, IfdBase> mapEntities = new Dictionary <string, IfdBase>(); // core schema foreach (DocSection docSection in docProject.Sections) { foreach (DocSchema docSchema in docSection.Schemas) { // only export objects that have associated property sets foreach (DocPropertySet docPset in docSchema.PropertySets) { IfdBase ifdPset = CreateConcept(baseurl, sessionid, docPset, docPset.Name, docPset.Name, docPset.PropertySetType.ToString(), IfdConceptTypeEnum.BAG); foreach (DocProperty docProp in docPset.Properties) { IfdBase ifdProp = CreateConcept(baseurl, sessionid, docProp, docProp.Name, docProp.Name, docProp.PropertyType.ToString(), IfdConceptTypeEnum.PROPERTY); if (ifdProp != null) { CreateRelationship(baseurl, sessionid, ifdPset.guid, ifdProp.guid, IfdRelationshipTypeEnum.COLLECTS); string paramval = docProp.PrimaryDataType; if (!String.IsNullOrEmpty(paramval)) { DocDefinition docDef = docProject.GetDefinition(paramval); if (docDef != null) { // get the measure type IfdBase ifdType = SearchConcept(baseurl, sessionid, docDef.Name, IfdConceptTypeEnum.MEASURE); if (ifdType == null) { // create concept ifdType = CreateConcept(baseurl, sessionid, docDef, docDef.Name, docDef.Name, null, IfdConceptTypeEnum.MEASURE); // for enums, get enumerated type if (docProp.PropertyType == DocPropertyTemplateTypeEnum.P_ENUMERATEDVALUE) { DocSchema docPropSchema = null; DocPropertyEnumeration docPropEnum = docProject.FindPropertyEnumeration(docProp.SecondaryDataType, out docPropSchema); if (docPropEnum != null) { foreach (DocPropertyConstant docPropConst in docPropEnum.Constants) { IfdBase ifdConst = CreateConcept(baseurl, sessionid, docPropConst, docPropConst.Name, docPropConst.Name, null, IfdConceptTypeEnum.VALUE); CreateRelationship(baseurl, sessionid, ifdType.guid, ifdConst.guid, IfdRelationshipTypeEnum.ASSIGNS_VALUES); } } } } CreateRelationship(baseurl, sessionid, ifdProp.guid, ifdType.guid, IfdRelationshipTypeEnum.ASSIGNS_MEASURES); // ??? fails for Pset_BuildingUse.NarrativeText / IfcText } } } } // now link the property set to applicable type DocEntity[] docEntities = docPset.GetApplicableTypeDefinitions(docProject); if (docEntities != null && docEntities.Length > 0) { // only the first one matters DocEntity docEnt = docEntities[0]; IfdBase ifdEnt = null; if (!mapEntities.TryGetValue(docEnt.Name, out ifdEnt)) { ifdEnt = CreateConcept(baseurl, sessionid, docEnt, docEnt.Name, docEnt.Name, null, IfdConceptTypeEnum.SUBJECT); mapEntities.Add(docEnt.Name, ifdEnt); // subtypes (predefined type) foreach (DocAttribute docAttr in docEnt.Attributes) { if (docAttr.Name.Equals("PredefinedType")) { DocEnumeration docEnum = docProject.GetDefinition(docAttr.DefinedType) as DocEnumeration; if (docEnum != null) { foreach (DocConstant docConst in docEnum.Constants) { IfdBase ifdConst = CreateConcept(baseurl, sessionid, docConst, docConst.Name, docConst.Name, null, IfdConceptTypeEnum.SUBJECT); CreateRelationship(baseurl, sessionid, ifdEnt.guid, ifdConst.guid, IfdRelationshipTypeEnum.SPECIALIZES); } } } } } CreateRelationship(baseurl, sessionid, ifdEnt.guid, ifdPset.guid, IfdRelationshipTypeEnum.ASSIGNS_COLLECTIONS); //!!! Fails with Forbidden!!! why??? // http://test.bsdd.buildingsmart.org/api/4.0/IfdRelationship/validrelations/SUBJECT/BAG indicates // <ifdRelationshipTypeEnums> // <IfdRelationshipType xmlns="http://peregrine.catenda.no/objects">ASSIGNS_COLLECTIONS</IfdRelationshipType> // </ifdRelationshipTypeEnums> } } foreach (DocQuantitySet docPset in docSchema.QuantitySets) { IfdBase ifdPset = CreateConcept(baseurl, sessionid, docPset, docPset.Name, docPset.Name, "QTO_OCCURRENCEDRIVEN", IfdConceptTypeEnum.BAG); foreach (DocQuantity docProp in docPset.Quantities) { IfdBase ifdProp = CreateConcept(baseurl, sessionid, docProp, docProp.Name, docProp.Name, docProp.QuantityType.ToString(), IfdConceptTypeEnum.PROPERTY); if (ifdProp != null) { CreateRelationship(baseurl, sessionid, ifdPset.guid, ifdProp.guid, IfdRelationshipTypeEnum.COLLECTS); string propclass = "IfcQuantityCount"; switch (docProp.QuantityType) { case DocQuantityTemplateTypeEnum.Q_AREA: propclass = "IfcQuantityArea"; break; case DocQuantityTemplateTypeEnum.Q_COUNT: propclass = "IfcQuantityCount"; break; case DocQuantityTemplateTypeEnum.Q_LENGTH: propclass = "IfcQuantityLength"; break; case DocQuantityTemplateTypeEnum.Q_TIME: propclass = "IfcQuantityTime"; break; case DocQuantityTemplateTypeEnum.Q_VOLUME: propclass = "IfcQuantityVolume"; break; case DocQuantityTemplateTypeEnum.Q_WEIGHT: propclass = "IfcQuantityWeight"; break; } string paramval = propclass; if (!String.IsNullOrEmpty(paramval)) { DocDefinition docDef = docProject.GetDefinition(paramval); if (docDef != null) { // get the measure type IfdBase ifdType = SearchConcept(baseurl, sessionid, docDef.Name, IfdConceptTypeEnum.MEASURE); if (ifdType == null) { // create concept ifdType = CreateConcept(baseurl, sessionid, docDef, docDef.Name, docDef.Name, null, IfdConceptTypeEnum.MEASURE); } CreateRelationship(baseurl, sessionid, ifdProp.guid, ifdType.guid, IfdRelationshipTypeEnum.ASSIGNS_MEASURES); // ??? fails for Pset_BuildingUse.NarrativeText / IfcText } } } } // now link the property set to applicable type DocEntity[] docEntities = docPset.GetApplicableTypeDefinitions(docProject); if (docEntities != null && docEntities.Length > 0) { // only the first one matters DocEntity docEnt = docEntities[0]; IfdBase ifdEnt = null; if (mapEntities.TryGetValue(docEnt.Name, out ifdEnt)) { CreateRelationship(baseurl, sessionid, ifdEnt.guid, ifdPset.guid, IfdRelationshipTypeEnum.ASSIGNS_COLLECTIONS); } } } } } } }
private static string FormatField(DocProject docProject, string content /*deprecate*/, string fieldname, string fieldtype/*deprecate*/, string fieldvalue/*deprecate*/) { DocDefinition docDef = docProject.GetDefinition(fieldname); // hyperlink to enumerators if (docDef is DocEnumeration) { // hyperlink to enumeration definition // replace it with hyperlink DocSchema docSchema = docProject.GetSchemaOfDefinition(docDef); string relative = @"../../"; string hyperlink = relative + docSchema.Name.ToLower() + @"/lexical/" + docDef.Name.ToLower() + ".htm"; string format = "<a href=\"" + hyperlink + "\">" + fieldvalue + "</a>"; return format;// content.Replace(fieldname, format); } else if (docDef is DocEntity || docDef is DocType)//fieldvalue != null && fieldvalue.StartsWith("Ifc") && docProject.GetDefinition(fieldvalue) != null) { // replace it with hyperlink DocSchema docSchema = docProject.GetSchemaOfDefinition(docDef); string relative = @"../../"; string hyperlink = relative + docSchema.Name.ToLower() + @"/lexical/" + docDef.Name.ToLower() + ".htm"; string format = "<a href=\"" + hyperlink + "\">" + fieldvalue + "</a>"; return format;// content.Replace(fieldname, format); } else //if (docDef == null) { // hyperlink to property set definition DocSchema docSchema = null; DocObject docObj = docProject.FindPropertySet(fieldvalue, out docSchema); if (docObj is DocPropertySet) { string relative = @"../../"; string hyperlink = relative + docSchema.Name.ToLowerInvariant() + @"/pset/" + docObj.Name.ToLower() + ".htm"; // case-sensitive on linux -- need to make schema all lowercase string format = "<a href=\"" + hyperlink + "\">" + fieldvalue + "</a>"; return format;// content.Replace(fieldname, format); } else { docObj = docProject.FindPropertyEnumeration(fieldvalue, out docSchema); if(docObj is DocPropertyEnumeration) { string relative = @"../../"; string hyperlink = relative + docSchema.Name.ToLowerInvariant() + @"/pset/" + docObj.Name.ToLower() + ".htm"; // case-sensitive on linux -- need to make schema all lowercase string format = "<a href=\"" + hyperlink + "\">" + fieldvalue + "</a>"; return format;// content.Replace(fieldname, format); } else { docObj = docProject.FindQuantitySet(fieldvalue, out docSchema); if (docObj is DocQuantitySet) { string relative = @"../../"; string hyperlink = relative + docSchema.Name.ToLowerInvariant() + @"/qset/" + docObj.Name.ToLower() + ".htm"; // case-sentive on linux -- need to make schema all lowercase string format = "<a href=\"" + hyperlink + "\">" + fieldvalue + "</a>"; return format;// content.Replace(fieldname, format); } } } if (docObj == null) { // simple replace -- hyperlink may markup value later return fieldvalue;// content.Replace(fieldname, fieldvalue); } } /* else { // simple replace -- hyperlink may markup value later return content.Replace(fieldname, fieldvalue); }*/ return content; }