当前位置:网站首页>Revit secondary development - collision detection
Revit secondary development - collision detection
2022-07-07 22:22:00 【Hey, hey, hey, hey, hey】
Make a note of , It's easy to write This is the core code .
Not measured carefully , Anyway, the current detection is and rvt The self-contained collision detection results are the same .
List<ElementId> left;// Elements to detect collisions id
List<ElementId> right;// Elements to detect collisions id
string sResult="";
foreach(ElementId eid left)
{
Element elem = doc.GetElement(eid);
FilteredElementCollector collector = new FilteredElementCollector(doc,right);// Create collector , Specify the collection range
ElementIntersectsElementFilter filter = new ElementIntersectsElementFilter(elem);// use API Filter intersecting elements
List<Element> lstElem = collector.WherePasses(filter).ToElements().ToList();
if(lstElem.Count > 0)
{
foreach(Element collision_elem lstElem)
{
sInfo += elem.Name+" Id:"+elem.Id+" ----- "+collision_elem.Name+" Id:"+collision_elem.Id +"\n";
}
// Handle two sets with the same id when , Prevent duplicate detection
if(right.Contains(eid))
right.Remove(eid);
}
}
TaskDialog.Show("result",sInfo);
Pure hand tap , May be wrong , You can modify or reply by yourself .
----------- to update ---------------
If you test a large model ,List<Element> lstElem = collector.WherePasses(filter).ToElements().ToList();
Running this code will be very time-consuming , The interface appears to be suspended . Want to display the detection progress through the progress bar , Make the interface better .
It won't work in this way , Because I can't get the progress of detection ( I wonder if you can get it ?)
The same problem is also encountered in online query , And give the solution :
1. use boundingboxIntersectFilter and boundingboxIsInsideFilter Quickly filter out collision elements ( These two belong to the fast filter ), But the filtered elements will be inaccurate , We want to delete the included but disjoint elements from the set .
2. use ElementIntersectsSolidFilter( Slow filter ) Confirm whether there is a real collision
List<ElementId> left;
List<ElementId> right;
List<ElementId> realEids;// Real collision id
// Record key And which elements have been detected
Dictionary<ElementId,List<ElementId>> m_dicCheck;
int iCount = 0;// Quickly filtered id total
foreach(ElementId eid left)
{// This cycle can display the overall progress of the test
// Prevent duplicate detection
List<ElementId> temp = right;
if(m_dicCheck.Count > 0)
{
foreach(ElementId id in m_dicCheck.Keys)
{
if(m_dicCheck[id].Contains(eid))
temp.Remove(id);
}
m_dicCheck.Add(eid,temp);
}
else
{
m_dicCheck.Add(eid,temp);
}
Element elem = doc.GetElement(eid);
BoundingBoxXYZ boxXYZ = elem.get_BoundingBox(doc.ActiveView);
Outline ol = new Outline(boxXYZ.Min,boxXYZ.Max);
BoundingBoxIntersectsFilter boxIntersectsFilter = new BoundingBoxIntersectsFilter(ol);
BoundingBoxIsInsideFilter boxIsInsideFilter = new BoundingBoxIsInsideFilter(ol);
LogicalOrFilter filter = new LogicalOrFilter(boxIntersectsFilter,boxIsInsideFilter);
FilteredElememntCollector collector = new FilteredElememntCollector(doc,temp);
// Use a quick filter to get all intersections / Contained elements , And remove the duplicate in the set id
List<ElementId> lstEid = collector.WherePasses(filter).ToElementIds().Distinct().ToList();
// Remove the detection element itself
lstEid = lstEid.Where(e=>e != eid).ToList();
iCount = lstEid.Count;
// Get all of the currently detected elements solid
List<Solid> lstSolid = GetElementSolid(elem);
if(lstSolid.Count == 0)
continue;
// Then it is a cycle to judge whether the collision is real
foreach(Solid solid lstSolid)
{// This loop can show the progress of individual element detection
FilteredElementCollector collisionCollector = new FilteredElementCollector(doc,lstEid);
ElementIntersectsSolidFilter collisionFilter = new ElementIntersectsSolidFilter(solid);
List<ElementId> Ids = collisionCollector.WherePasses(collisionFilter).ToElementIds().ToList();
// Release the filter and collector , Otherwise, creating too many will overflow memory
collisionCollector.Dispose();
collisionFilter.Dispose();
if(Ids.Count > 0)
{
realEids.AddRange(Ids);
if(tempEids.Count == iCount)
break;
// Will filter out id from lstEid Delete... From the collection , Narrow the detection range
foreach(ElementId itemId Ids)
{
if(lstEid.Contains(itemId)) lstEid.Remove(itemId);
}
}
}
//
// Real collision elements id ad locum realEids, Perform the operation on the result here
//
realEids.Clear();
}
obtain Element Entity of Solid
private List<Solid> GetElementSolid(Element elem)
{
List<Solid> lstSolid = new List<Solid>();
Options opt = new Option();
opt.ComputeReferences = true;
opt.IncludeNonVisbleObjects = true;
GeometryElement ge = element.get_Geomtry(opt);
if(ge != null)
lstSolid.AddRange(GetSolid(ge));
return lstSolid;
}
private List<Solid> GetSolid(GeometryElement ge)
{
List lstSolid = new List<Solid>();
foreach(GeomtryObject go in ge)
{
if(go is Solid)
{
Solid solid = go as Solid;
if(solid.SurfaceArea > 0 && solid.Volume > 0 && solid.Faces.Size > 1 && solid.Edges.Size > 1)
lstSolid.Add(solid);
}
else if(go is GeometryInstance)
{
GeomtryElement ge = (go as GeometryInstance).GetInstanceGeometry();
lstSolid.AddRange(GetSolid(ge));
}
}
return lstSolid;
}
Hand tapping , Correct or reply yourself if there is an error .
边栏推荐
- Add get disabled for RC form
- Time standard library
- Kaggle-Titanic
- [interview arrangement] 0211 game engine server
- Kirin Xin'an operating system derivative solution | storage multipath management system, effectively improving the reliability of data transmission
- Win11U盘不显示怎么办?Win11插U盘没反应的解决方法
- ByteDance senior engineer interview, easy to get started, fluent
- Record a garbled code during servlet learning
- Get the exact offset of the element
- How to quickly check whether the opening area ratio of steel mesh conforms to ipc7525
猜你喜欢
Matplotlib快速入门
大数据开源项目,一站式全自动化全生命周期运维管家ChengYing(承影)走向何方?
[advanced MySQL] index details (I): index data page structure
[JDBC Part 1] overview, get connection, CRUD
用语雀写文章了,功能真心强大!
Antd date component appears in English
How does win11 unblock the keyboard? Method of unlocking keyboard in win11
How to quickly check whether the opening area ratio of steel mesh conforms to ipc7525
How to turn on win11 game mode? How to turn on game mode in win11
Have you ever been confused? Once a test / development programmer, ignorant gadget C bird upgrade
随机推荐
Cv2.resize function reports an error: error: (-215:assertion failed) func= 0 in function ‘cv::hal::resize‘
Song list 11111
Which financial products will yield high returns in 2022?
ByteDance Android interview, summary of knowledge points + analysis of interview questions
An in-depth understanding of fp/fn/precision/recall
Vs custom template - take the custom class template as an example
[interview arrangement] 0211 game engine server
如何实现横版游戏中角色的移动控制
Which futures company is the safest to open a futures account?
Anti climbing killer
Matplotlib drawing interface settings
NVR hard disk video recorder is connected to easycvr through the national standard gb28181 protocol. What is the reason why the device channel information is not displayed?
【colmap】稀疏重建转为MVSNet格式输入
[open source] Net ORM accessing Firebird database
Talk about relational database and serverless
operator
[open source] Net ORM accessing Firebird database
Dbsync adds support for mongodb and ES
100million single men and women "online dating", supporting 13billion IPOs
The difference between NPM uninstall and RM direct deletion