2016-07-06 37 views
-1

1-我怎样才能找到在x,yI斜墙角度使用下面的代码找到它的墙壁,但它不适用于倾斜墙壁。 当我将它用于普通墙时,它给出的XYz类似于0,1,0/0,-1,0/1,0,0/-1,0,0 ,但对于倾斜的墙它变成了0,0, 1所有的时间。请阅读代码。 2-我想在我的Revit项目中使用 API找到门窗的Id。我可以在墙上找到开口,但实际需要的却完全相反,我需要主持人。斜壁方向和门窗主机revit api

protected XYZ GetExteriorWallDirection(Element wall) 
    { 
     LocationCurve locationCurve 
      = wall.Location as LocationCurve; 

     XYZ exteriorDirection = XYZ.BasisZ; 

     if (locationCurve != null) 
     { 
      Curve curve = locationCurve.Curve; 

      //Write("Wall line endpoints: ", curve); 

      XYZ direction = XYZ.BasisX; 

      if (curve is Line) 
      { 
       // Obtains the tangent vector of the wall. 

       direction = curve.ComputeDerivatives(
        0, true).BasisX.Normalize(); 
      } 
      else 
      { 


       // An assumption, for non-linear walls, 
       // that the "tangent vector" is the direction 
       // from the start of the wall to the end. 

       direction = (curve.GetEndPoint(1) 
        - curve.GetEndPoint(0)).Normalize(); 
      } 

      // Calculate the normal vector via cross product. 

      exteriorDirection = getCrossProduct(XYZ.BasisZ,direction); 

      // Flipped walls need to reverse the calculated direction 
      Wall wa = wall as Wall; 
      if (wa.Flipped) 
      { 
       exteriorDirection = -exteriorDirection; 
      } 
     } 
     return exteriorDirection; 
    } 



protected XYZ getCrossProduct(XYZ a, XYZ b) 
    { 
     double ax = a.X; 
     double ay = a.Y; 
     double az = a.Z; 
     double bx = b.X; 
     double by = b.Y; 
     double bz = b.Z; 


     double cx = ay * bz - az * by;//= 3×7 − 4×6 = −3 
     double cy = az * bx - ax * bz;//= 4×5 − 2×7 = 6 
     double cz = ax * by - ay * bx;// = 2×6 − 3×5 = −3 


     XYZ c = new XYZ(cx, cy, cz); 
     return c; 

    } 

回答

0

您需要获取HOST_ID_PARAM等于您拥有的墙ID的所有元素。 Here is an example。以下是它的最低版本。

private static void HostedFamilyInstanceOpenings(Wall wall) 
{ 

    // Filter all Family Instances where the HOST_ID_PARAM 
    // equals the wall ID 
    // 
    // More information at 
    // http://thebuildingcoder.typepad.com/ 
    //     blog/2010/06/parameter-filter.html#4 
    BuiltInParameter testParam = 
     BuiltInParameter.HOST_ID_PARAM; 
    ParameterValueProvider pvp = 
     new ParameterValueProvider(
      new ElementId((int)testParam)); 

    FilterNumericRuleEvaluator fnrv = new FilterNumericEquals(); 
    ElementId ruleValId = wall.Id; 

    FilterRule paramFr = new FilterElementIdRule 
    (pvp, fnrv, ruleValId); 
    ElementParameterFilter epf = 
    new ElementParameterFilter(paramFr); 
    FilteredElementCollector collector = 
     new FilteredElementCollector(wall.Document); 

    collector.OfClass(typeof(FamilyInstance)).WherePasses(epf); 
    IList<Element> hostedFamilyInstances = collector.ToElements(); 

    // Now iterate through the collected family instances 
    foreach (FamilyInstance instance in hostedFamilyInstances) 
    { 

    } 
}