예제 #1
0
        public void ScanFromDocument(Document doc, MEPRevitGraph graph, int maxDepth)
        {
            Dictionary <int, HashSet <FamilyInstance> > spaceToDoors = new Dictionary <int, HashSet <FamilyInstance> >();

            scanFromDocument(graph, doc, Transform.Identity, doc);

            //get linked documents
            foreach (RevitLinkInstance linkedInstance in DocUtils.GetLinkInstances(doc))
            {
                //RevitLinkType linkType = (RevitLinkType)doc.GetElement(linkedInstance.GetTypeId()) as RevitLinkType;

                //ExternalFileReference exfRef = linkType.GetExternalFileReference();

                //if (exfRef.GetLinkedFileStatus() != LinkedFileStatus.Loaded) continue;


                var ldoc = linkedInstance.GetLinkDocument();
                if (ldoc == null)
                {
                    continue;
                }
                scanFromDocument(graph, ldoc, linkedInstance.GetTotalTransform().Inverse, doc);
            }
        }
예제 #2
0
        public void Write(ICollection <Element> scanElements, ICollection <Element> geoSerchElements, int maxDepth, bool doGeometryMatch, Document doc)
        {
            Cache.connectorsCache = new PointOctree <ConnectorPointGeometrySegment>(6.56168F, XYZ.Zero, 2F);
            Cache.MaxDepth        = maxDepth;
            Cache.geoCache        = new BoundsOctree <GeometrySegment>(2, XYZ.Zero, 2F, 1.001f);
            Cache.geoCacheWriter  = new BoundsOctreeElementWriter(Cache.geoCache);
            Cache.ParsedElements  = new HashSet <int>();
            Cache.rayhitCache     = new PointOctree <FaceIntersectRay>(2, XYZ.Zero, 2F);

            var dsCount = geoSerchElements.Count;

            foreach (var elm in geoSerchElements)
            {
                var cmn = MEPUtils.GetConnectionManager(elm);
                if (cmn != null)
                {
                    foreach (var conn in cmn.Connectors.OfType <Connector>())
                    {
#if REVIT2016
                        var gesseg = new ConnectorPointGeometrySegment(elm.Id, conn.Origin, conn.Id);
                        Cache.connectorsCache.Add(gesseg, conn.Origin);
#else
                        throw new Exception("Only supported in Revit 2016 onwards");
#endif
                    }
                }

                if (doGeometryMatch)
                {
                    Cache.geoCacheWriter.AddElement(elm, true);
                }
            }

            if (doGeometryMatch)
            {
                var li = DocUtils.GetLinkInstances(doc);
                dsCount = li.Count();
                //cache geometry in linked documents. The geometry is expected to remain static, or changed as a block, so we don't need to keep track of each element.
                foreach (var linkedInstance in li)
                {
                    Transform docTransform        = linkedInstance.GetTotalTransform();
                    Transform docTransformInverse = docTransform.Inverse;

                    //RevitLinkType linkType = (RevitLinkType)rDoc.GetElement(linkedInstance.GetTypeId()) as RevitLinkType;
                    var ldoc = linkedInstance.GetLinkDocument();// HLRevitUtilities.GetLinkedDocumentFromType(_rdoc.Application, linkType);
                    if (ldoc == null)
                    {
                        continue;
                    }

                    var lnGeoCol    = new FilteredElementCollector(ldoc);
                    var lnGeoFilter = new ElementMulticategoryFilter(new BuiltInCategory[] { BuiltInCategory.OST_Floors, BuiltInCategory.OST_Roofs });

                    foreach (var lnelm in lnGeoCol.WherePasses(lnGeoFilter).WhereElementIsNotElementType().ToElements())
                    {
                        Cache.geoCacheWriter.AddElement(lnelm, true, docTransformInverse);
                    }
                }
            }


            var elmcache    = new HashSet <int>();
            var parserCount = Parsers.Count;

            foreach (var parser in Parsers)
            {
                parser.InitializeGraph(this);
                var elms = scanElements.Where(el => parser.CanParse(el)).ToList();
                dsCount = elms.Count();

                foreach (var elm in elms)
                {
                    parser.ParseFrom(elm, this);
                }
                parser.FinalizeGraph(this);
            }
        }