2017-02-27 8 views
0

섹션의 내부에 일부 상세 선이 있는데, 해당 부분의 CropBox 중간 점을 기준으로 미러를 적용합니다. 나는 시도하고 이것을 달성하기 위해 ElementTransformUtils.MirrorElements를 사용하고 있습니다. 그러나 세부 선을 대칭 할 정확한 평면을 아직 찾을 수 없었습니다. Plane.CreateByNormalAndOrigin(section.ViewDirection, section.Origin)detailLine.SketchPlane.GetPlane()을 시도했지만 그 중 누구도 세부적인 내용을 반영하지 않았습니다. 이 작업을 수행하는 올바른 방법은Revit API를 사용하여 단면 뷰 내부의 세부 정보 미러링

Mirroring Detail Lines

무엇입니까?

답변

0

ViewSection.CropBox하지만 다소 복잡했습니다. 나는 ViewSection.Origin이 프로젝트 좌표계의 한 점인 것을 발견했습니다. 반면에 ViewSection.CropBox은 프로젝트 좌표계에서 Min 및 Max를 제공하지 않지만 대신 ViewSection.Origin에 상대적인 CropBox의 위치를 ​​제공합니다. ViewSection.OriginViewSection.CropBox을 사용하면 프로젝트 좌표계에서 ViewSection.CropBox의 최소 및 최대를 계산할 수 있습니다. 마지막으로, 최소값과 최대 값을 사용하여 ViewSection.CropBox의 중간 점을 찾은 다음 해당 점을 가로 질러 미러링해야합니다. 여기

내가 최소 및 최대가 최소 또는 최대의 X, Y, 또는 Z 구성 요소를 찾을 수있는 기능을 하나의 함수 여기

public enum PointComponent 
{ 
    Invalid, 
    X, 
    Y, 
    Z 
} 

public enum MinOrMax 
{ 
    Invalid, 
    Min, 
    Max 
} 

있어 사용하여 찾을 수 있도록 사용하는 일부 헬퍼 클래스이다 CropBox : PointComponent.Z 위해 우리는 최소 및 최대 값 사이의 중간 점을 사용하는 대신 원점을 사용하지 않는 것이

private double GetSectionCropBoxOrigin(ViewSection section, 
    PointComponent pointComponent, MinOrMax minOrMax) 
{ 
    double cropBoxOrigin; 

    double sectionOrigin, viewDirection, upDirection, rightDirection; 

    switch (pointComponent) 
    { 
    case PointComponent.X: 
     sectionOrigin = section.Origin.X; 
     viewDirection = section.ViewDirection.X; 
     upDirection = section.UpDirection.X; 
     rightDirection = section.RightDirection.X; 
     break; 
    case PointComponent.Y: 
     sectionOrigin = section.Origin.Y; 
     viewDirection = section.ViewDirection.Y; 
     upDirection = section.UpDirection.Y; 
     rightDirection = section.RightDirection.Y; 
     break; 
    case PointComponent.Z: 
     sectionOrigin = section.Origin.Z; 
     viewDirection = section.ViewDirection.Z; 
     upDirection = section.UpDirection.Z; 
     rightDirection = section.RightDirection.Z; 
     break; 
    default: 
     throw new InvalidOperationException(); 
    } 

    double cropX, cropY; 

    switch (minOrMax) 
    { 
    case MinOrMax.Min: 
     cropX = section.CropBox.Min.X; 
     cropY = section.CropBox.Min.Y; 
     break; 
    case MinOrMax.Max: 
     cropX = section.CropBox.Max.X; 
     cropY = section.CropBox.Max.Y; 
     break; 
    default: 
     throw new InvalidOperationException(); 
    } 

    if (Math.Abs(viewDirection) == 1) 
    cropBoxOrigin = sectionOrigin; 
    else if (Math.Abs(upDirection) == 1) 
    cropBoxOrigin = sectionOrigin + (cropY * upDirection); 
    else if (Math.Abs(rightDirection) == 1) 
    cropBoxOrigin = sectionOrigin + (cropX * rightDirection); 
    else 
    throw new InvalidOperationException(); 

    return cropBoxOrigin; 
} 

알 수 있습니다. 이는 CropBox 깊이를 지정하고 세부 작업이 ViewSection.Origin과 동일한 깊이에 있더라도 2D 작업 만 수행하기 때문입니다.

private XYZ Get3dMidpoint(XYZ start, XYZ end) 
{ 
    double x = (start.X + end.X)/2.0; 
    double y = (start.Y + end.Y)/2.0; 
    double z = (start.Z + end.Z)/2.0; 

    return new XYZ(x, y, z); 
} 

그리고 마지막으로 여기에 코드가 거울면 모두 함께 가져오고 얻을 수있다 : :

XYZ cropBoxMinInGlobalCoordinates = new XYZ(
    GetSectionCropBoxOrigin(section, PointComponent.X, MinOrMax.Min), 
    GetSectionCropBoxOrigin(section, PointComponent.Y, MinOrMax.Min), 
    GetSectionCropBoxOrigin(section, PointComponent.Z, MinOrMax.Min) 
); 
XYZ cropBoxMaxInGlobalCoordinates = new XYZ(
    GetSectionCropBoxOrigin(section, PointComponent.X, MinOrMax.Max), 
    GetSectionCropBoxOrigin(section, PointComponent.Y, MinOrMax.Max), 
    GetSectionCropBoxOrigin(section, PointComponent.Z, MinOrMax.Max) 
); 
XYZ cropBoxOriginInGlobalCoordinates = 
    Get3dMidpoint(cropBoxMinInGlobalCoordinates, cropBoxMaxInGlobalCoordinates); 

Plane mirrorPlane = 
    Plane.CreateByNormalAndOrigin(section.RightDirection, cropBoxOriginInGlobalCoordinates); 
을 여기

내가 중간 점을 얻기 위해 사용하는 코드입니다
0

예, 언급 한 비행기는 예상대로 미러링되지 않습니다.

세부 선에 수직 인 평면이 필요합니다.

오른쪽에서 왼쪽으로 또는 그 반대로 표시하는 것과 같이 수평선을 비 춥니 다.

당신은 세부 라인 자체에서 미러 비행기가 정상 및 원산지 판별 할 수

XYZ p = detail line start point 
    XYZ q = detail line end point 
    XYZ normal = q - p 
    Plane plane = Plane.CreateByNormalAndOrigin(p, normal) 

더 많거나 적은 ... 나는의 중간에 걸쳐 미러링 할 내 정보를 얻을 수 있었다