1

手動で移動しない場所

[![基点位置から測量点に移動したときの正しい位置][2]][2]

測量点からの基点の寸法

Revit で navisworks のクラッシュ ポイントを表示するプログラムを作成中ですが、基点が (0,0,0) でない場合、正確な位置に配置するのが難しいと感じています。コードに場所の違いを手動で追加すると、機能します。これをプログラムで解決するにはどうすればよいですか? おそらく簡単な計算があることは理解していますが、それを理解できないようです。私はグーグルでいくつかのアイデアを試してみましたが、役に立ちませんでした。これについてどうすればいいですか?

public static XYZ WorldToLocal(Document document, XYZ coordinate, bool millimeters)
        {
            ElementCategoryFilter filter = new ElementCategoryFilter(BuiltInCategory.OST_ProjectBasePoint);
            FilteredElementCollector collector = new FilteredElementCollector(document);
            IList<Element> oProjectBasePoints = collector.WherePasses(filter).ToElements();

            Element oProjectBasePoint = null;

            foreach (Element bp in oProjectBasePoints)
            {
                oProjectBasePoint = bp;
                break;
            }

            double x = oProjectBasePoint.get_Parameter(BuiltInParameter.BASEPOINT_EASTWEST_PARAM).AsDouble();
            double y = oProjectBasePoint.get_Parameter(BuiltInParameter.BASEPOINT_NORTHSOUTH_PARAM).AsDouble();
            double z = oProjectBasePoint.get_Parameter(BuiltInParameter.BASEPOINT_ELEVATION_PARAM).AsDouble();
            double r = oProjectBasePoint.get_Parameter(BuiltInParameter.BASEPOINT_ANGLETON_PARAM).AsDouble();

            XYZ result = new XYZ(
             coordinate.X * Math.Cos(r) - coordinate.Y * Math.Sin(r) ,
             coordinate.X * Math.Sin(r) + coordinate.Y * Math.Cos(r),
             coordinate.Z);

//Code that makes it work
            XYZ newpostion = new XYZ(result.X - 21.943, result.Y +13.410, result.Z);
//ends here
            if (millimeters)
            {
                return newpostion * 304.8;
            }
            return newpostion; 

        }
4

1 に答える 1

0

これにより、測量ポイントの位置がベース ポイントに戻されます。私の質問を解決します。

   IEnumerable<BasePoint> points = new FilteredElementCollector(document)
                .OfClass(typeof(BasePoint))
                .Cast<BasePoint>();

            XYZ surveypointXYZ = new XYZ();
            foreach (BasePoint bp in points)
            {
                if (bp.IsShared)
                {
                    BoundingBoxXYZ bb = bp.get_BoundingBox(null);
                    surveypointXYZ = bb.Min;

                }
            }
于 2020-07-04T21:59:22.297 に答える