2016-07-06 8 views
-1

1- Как я могу найти угол для наклонной стены в x, yI использовал код ниже, чтобы найти его для стен, но он не работал для наклонной стены , Когда я использую его для обычных стен, он дает XYz, как 0,1,0/0, -1,0/1,0,0/-1,0,0 , но для наклонной стены он становится 0,0, 1 все время. Пожалуйста, прочитайте код. 2- Я хочу найти стену Id для окон и дверей в моем проекте Revit с использованием API. Я могу найти отверстия в стене, но то, что мне действительно нужно, - это совсем наоборот, мне нужен хозяин.Наклонное стеновое направление и хост для окон и дверей 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) 
    { 

    } 
}