ViewSection.CropBox
하지만 다소 복잡했습니다. 나는 ViewSection.Origin
이 프로젝트 좌표계의 한 점인 것을 발견했습니다. 반면에 ViewSection.CropBox
은 프로젝트 좌표계에서 Min 및 Max를 제공하지 않지만 대신 ViewSection.Origin
에 상대적인 CropBox의 위치를 제공합니다. ViewSection.Origin
및 ViewSection.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);
을 여기
내가 중간 점을 얻기 위해 사용하는 코드입니다