diff --git a/src/Core/PathPointRenderPlugin.cs b/src/Core/PathPointRenderPlugin.cs
index baf88ef..541c727 100644
--- a/src/Core/PathPointRenderPlugin.cs
+++ b/src/Core/PathPointRenderPlugin.cs
@@ -34,14 +34,14 @@ namespace NavisworksTransport
Sphere,
///
- /// 立方体
+ /// 正方形
///
- Cube,
+ Rectangle,
///
- /// 点
+ /// 圆
///
- Point
+ Circle
}
@@ -291,13 +291,13 @@ namespace NavisworksTransport
private readonly object _lockObject = new object();
private Dictionary _pathVisualizations = new Dictionary();
private bool _isEnabled = true;
-
+
// 预览点标记
private CircleMarker _previewMarker = null;
-
+
// 预览连线标记
private List _previewLines = new List();
-
+
// 当前网格大小(米),用于自适应点大小计算
private double _currentGridSizeInMeters;
@@ -305,7 +305,7 @@ namespace NavisworksTransport
private PathVisualizationMode _visualizationMode = PathVisualizationMode.StandardLine;
// 网格点类型配置
- private GridPointType _gridPointType = GridPointType.Cube;
+ private GridPointType _gridPointType = GridPointType.Rectangle;
// 车辆参数(必须通过SetVehicleParameters方法设置)
private double _vehicleLength;
@@ -364,8 +364,8 @@ namespace NavisworksTransport
public bool IsEnabled
{
get { return _isEnabled; }
- set
- {
+ set
+ {
_isEnabled = value;
// 触发视图刷新
if (Application.ActiveDocument?.ActiveView != null)
@@ -380,8 +380,8 @@ namespace NavisworksTransport
///
public int PathCount
{
- get
- {
+ get
+ {
lock (_lockObject)
{
return _pathVisualizations.Count;
@@ -394,8 +394,8 @@ namespace NavisworksTransport
///
public int MarkerCount
{
- get
- {
+ get
+ {
lock (_lockObject)
{
return _pathVisualizations.Values.Sum(v => v.PointMarkers.Count);
@@ -409,7 +409,7 @@ namespace NavisworksTransport
/// 当前视图
/// 图形上下文
public override void Render(View view, Graphics graphics)
- {
+ {
if (!_isEnabled) return;
try
@@ -420,7 +420,7 @@ namespace NavisworksTransport
{
return; // 静默返回,避免日志泛滥
}
-
+
// 检查是否有路径或预览点需要渲染
int pathCount;
bool hasPreviewPoint;
@@ -429,9 +429,9 @@ namespace NavisworksTransport
pathCount = _pathVisualizations.Count;
hasPreviewPoint = _previewMarker != null;
}
-
+
if (pathCount == 0 && !hasPreviewPoint) return;
-
+
// 使用BeginModelContext确保正确的渲染上下文
graphics.BeginModelContext();
@@ -461,14 +461,14 @@ namespace NavisworksTransport
RenderVehicleSpace(graphics, vehicleSpaceMarker);
}
}
-
+
// 渲染预览点(灰色)
if (_previewMarker != null && _previewMarker.IsVisible)
{
graphics.Color(_previewMarker.Color, 0.7); // 使用半透明效果
RenderPointMarker(graphics, _previewMarker);
}
-
+
// 渲染预览连线(灰色)
if (_previewLines.Count > 0)
{
@@ -479,7 +479,7 @@ namespace NavisworksTransport
}
}
}
-
+
graphics.EndModelContext();
}
catch (Exception ex)
@@ -544,7 +544,7 @@ namespace NavisworksTransport
pathRoute.Id == "grid_visualization_door" ||
pathRoute.Id == "grid_visualization_unknown" ||
pathRoute.Id == "grid_visualization_obstacle";
-
+
var visualization = new PathVisualization
{
PathId = pathRoute.Id,
@@ -558,7 +558,7 @@ namespace NavisworksTransport
{
_pathVisualizations[pathRoute.Id] = visualization;
}
-
+
RequestViewRefresh();
}
catch (Exception ex)
@@ -724,7 +724,7 @@ namespace NavisworksTransport
var excludedSet = new HashSet(excludedPathIds.Where(id => !string.IsNullOrEmpty(id)));
var toRemove = _pathVisualizations.Keys.Where(id => !excludedSet.Contains(id)).ToList();
-
+
// 检查排除的路径是否实际存在
var existingExcluded = excludedSet.Where(id => _pathVisualizations.ContainsKey(id)).ToList();
var nonExistingExcluded = excludedSet.Where(id => !_pathVisualizations.ContainsKey(id)).ToList();
@@ -737,7 +737,7 @@ namespace NavisworksTransport
removedCount++;
}
}
-
+
if (removedCount > 0)
{
RequestViewRefresh();
@@ -909,7 +909,7 @@ namespace NavisworksTransport
gridStyle = new RenderStyle(gridStyle.Color, 0.5);
}
}
-
+
return new CircleMarker
{
Center = point.Position,
@@ -1230,7 +1230,7 @@ namespace NavisworksTransport
IsVisible = true,
PathPoint = previewPoint
};
-
+
// 请求刷新视图
RequestViewRefresh();
}
@@ -1254,7 +1254,7 @@ namespace NavisworksTransport
{
_previewMarker = null;
_previewLines.Clear();
-
+
// 请求刷新视图
RequestViewRefresh();
}
@@ -1284,14 +1284,14 @@ namespace NavisworksTransport
{
// 清除旧的预览连线
_previewLines.Clear();
-
+
// 找到预览点应该插入的最近线段
var nearestSegment = FindNearestLineSegment(previewPoint.Position, pathPoints);
-
+
if (nearestSegment.HasValue)
{
var (prevPoint, nextPoint) = nearestSegment.Value;
-
+
// 创建两条预览连线
// 1. 前一个点 -> 预览点
var line1 = new LineMarker
@@ -1302,7 +1302,7 @@ namespace NavisworksTransport
Radius = GetLineRadius() // 使用与正常连线相同的直径
};
_previewLines.Add(line1);
-
+
// 2. 预览点 -> 后一个点
var line2 = new LineMarker
{
@@ -1312,13 +1312,13 @@ namespace NavisworksTransport
Radius = GetLineRadius()
};
_previewLines.Add(line2);
-
+
}
else
{
LogManager.Warning("[预览连线渲染] 未找到合适的线段插入预览点");
}
-
+
// 请求刷新视图
RequestViewRefresh();
}
@@ -1341,7 +1341,7 @@ namespace NavisworksTransport
if (_previewLines.Count > 0)
{
_previewLines.Clear();
-
+
// 请求刷新视图
RequestViewRefresh();
}
@@ -1375,7 +1375,7 @@ namespace NavisworksTransport
// 找到预览点及其索引
var previewPointIndex = -1;
PathPoint previewPoint = null;
-
+
for (int i = 0; i < previewRoute.Points.Count; i++)
{
if (previewRoute.Points[i].Name.Contains("_预览"))
@@ -1385,12 +1385,12 @@ namespace NavisworksTransport
break;
}
}
-
+
if (previewPoint != null && previewPointIndex >= 0)
{
// 只渲染预览点
RenderPreviewPoint(previewPoint);
-
+
// 只渲染与预览点相关的连线
// 连接前一个点到预览点
if (previewPointIndex > 0)
@@ -1405,7 +1405,7 @@ namespace NavisworksTransport
};
_previewLines.Add(line1);
}
-
+
// 连接预览点到下一个点
if (previewPointIndex < previewRoute.Points.Count - 1)
{
@@ -1418,7 +1418,7 @@ namespace NavisworksTransport
Radius = GetLineRadius()
};
_previewLines.Add(line2);
- }
+ }
}
else
{
@@ -1469,7 +1469,7 @@ namespace NavisworksTransport
{
// 起点尺寸为网格大小的100%,并限制在合理范围内
double standardRadius = _currentGridSizeInMeters * 1.0;
-
+
// 边界限制:最小0.1米,最大0.5米
return Math.Max(0.1, Math.Min(0.5, standardRadius));
}
@@ -1607,13 +1607,13 @@ namespace NavisworksTransport
{
switch (pointMarker.GridPointType)
{
- case GridPointType.Cube:
+ case GridPointType.Rectangle:
// 渲染立方体
RenderCubeMarker(graphics, pointMarker);
break;
- case GridPointType.Point:
- // 渲染点
- graphics.Point(pointMarker.Center);
+ case GridPointType.Circle:
+ // 渲染圆
+ RenderCircleMarker(graphics, pointMarker);
break;
case GridPointType.Sphere:
default:
@@ -1630,23 +1630,40 @@ namespace NavisworksTransport
/// 点标记
private void RenderCubeMarker(Graphics graphics, CircleMarker pointMarker)
{
- // 计算立方体的边长(直径的一半)
- double halfSide = pointMarker.Radius;
+ // 计算正方形的边长(直径)
+ double sideLength = pointMarker.Radius * 2;
- // 定义立方体的三个轴向量(沿X、Y、Z轴)
- var xVector = new Vector3D(halfSide * 2, 0, 0);
- var yVector = new Vector3D(0, halfSide * 2, 0);
- var zVector = new Vector3D(0, 0, halfSide * 2);
+ // 定义正方形的两个轴向量(沿X、Y轴)
+ var xVector = new Vector3D(sideLength, 0, 0);
+ var yVector = new Vector3D(0, sideLength, 0);
- // 计算立方体原点(中心点减去各轴向量的一半)
+ // 计算正方形原点(中心点减去各轴向量的一半),略微抬高以避免与模型重叠
var origin = new Point3D(
- pointMarker.Center.X - halfSide,
- pointMarker.Center.Y - halfSide,
- pointMarker.Center.Z - halfSide
+ pointMarker.Center.X - pointMarker.Radius,
+ pointMarker.Center.Y - pointMarker.Radius,
+ pointMarker.Center.Z + 0.01
);
- // 使用Cuboid API渲染立方体
- graphics.Cuboid(origin, xVector, yVector, zVector, pointMarker.Filled);
+ // 使用Rectangle API渲染正方形
+ graphics.Rectangle(origin, xVector, yVector, pointMarker.Filled);
+ }
+
+ ///
+ /// 渲染圆形标记
+ ///
+ /// 图形上下文
+ /// 点标记
+ private void RenderCircleMarker(Graphics graphics, CircleMarker pointMarker)
+ {
+ // 调整中心点位置,略微抬高以避免与模型重叠
+ Point3D adjustCenterPoint = new Point3D(
+ pointMarker.Center.X,
+ pointMarker.Center.Y,
+ pointMarker.Center.Z + 0.01
+ );
+
+ // 使用Circle API渲染圆形
+ graphics.Circle(adjustCenterPoint, pointMarker.Normal, pointMarker.Radius, true);
}
///
@@ -1690,7 +1707,7 @@ namespace NavisworksTransport
// 按索引排序路径点
var sortedPoints = pathPoints.OrderBy(p => p.Index).ToList();
-
+
double minDistance = double.MaxValue;
(PathPoint prevPoint, PathPoint nextPoint)? nearestSegment = null;
@@ -1699,10 +1716,10 @@ namespace NavisworksTransport
{
var currentPoint = sortedPoints[i];
var nextPoint = sortedPoints[i + 1];
-
+
// 计算预览点到线段的距离
var distance = CalculatePointToLineSegmentDistance(previewPosition, currentPoint.Position, nextPoint.Position);
-
+
if (distance < minDistance)
{
minDistance = distance;
@@ -1724,36 +1741,36 @@ namespace NavisworksTransport
{
// 线段向量
var lineVector = new Point3D(lineEnd.X - lineStart.X, lineEnd.Y - lineStart.Y, lineEnd.Z - lineStart.Z);
-
+
// 点到线段起点的向量
var pointVector = new Point3D(point.X - lineStart.X, point.Y - lineStart.Y, point.Z - lineStart.Z);
-
+
// 计算线段长度的平方
var lineLengthSquared = lineVector.X * lineVector.X + lineVector.Y * lineVector.Y + lineVector.Z * lineVector.Z;
-
+
if (lineLengthSquared == 0)
{
// 线段退化为点,返回点到点的距离
return CalculateDistance(point, lineStart);
}
-
+
// 计算投影参数t
var t = (pointVector.X * lineVector.X + pointVector.Y * lineVector.Y + pointVector.Z * lineVector.Z) / lineLengthSquared;
-
+
// 将t限制在[0,1]范围内
t = Math.Max(0, Math.Min(1, t));
-
+
// 计算线段上最近点
var closestPoint = new Point3D(
lineStart.X + t * lineVector.X,
lineStart.Y + t * lineVector.Y,
lineStart.Z + t * lineVector.Z
);
-
+
// 返回点到最近点的距离
return CalculateDistance(point, closestPoint);
}
-
+
private static DateTime _lastRefreshTime = DateTime.MinValue;
#endregion
@@ -1821,10 +1838,10 @@ namespace NavisworksTransport
///
/// 位置(Center的别名,用于预览点兼容性)
///
- public Point3D Position
- {
- get { return Center; }
- set { Center = value; }
+ public Point3D Position
+ {
+ get { return Center; }
+ set { Center = value; }
}
///
@@ -1837,4 +1854,4 @@ namespace NavisworksTransport
return $"CircleMarker[序号={SequenceNumber}, 类型={PointType}, 中心=({Center.X:F2},{Center.Y:F2},{Center.Z:F2}), 半径={Radius:F2}]";
}
}
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/src/UI/WPF/ViewModels/SystemManagementViewModel.cs b/src/UI/WPF/ViewModels/SystemManagementViewModel.cs
index 7d9ab6f..0e45085 100644
--- a/src/UI/WPF/ViewModels/SystemManagementViewModel.cs
+++ b/src/UI/WPF/ViewModels/SystemManagementViewModel.cs
@@ -27,7 +27,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
private bool _showDoorGrid = false;
// 网格点类型字段
- private GridPointType _gridPointType = GridPointType.Cube;
+ private GridPointType _gridPointType = GridPointType.Rectangle;
private ObservableCollection _gridPointTypes;
// 路径可视化模式字段
@@ -121,9 +121,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels
if (SetProperty(ref _gridPointType, value))
{
// 通知相关的单选按钮属性更新
- OnPropertyChanged(nameof(IsCubePointType));
- OnPropertyChanged(nameof(IsSpherePointType));
- OnPropertyChanged(nameof(IsPointPointType));
+ OnPropertyChanged(nameof(IsRectanglePointType));
+ OnPropertyChanged(nameof(IsCirclePointType));
OnGridPointTypeChanged();
}
}
@@ -132,29 +131,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels
///
/// 是否使用立方体点类型
///
- public bool IsCubePointType
+ public bool IsRectanglePointType
{
- get => _gridPointType == GridPointType.Cube;
+ get => _gridPointType == GridPointType.Rectangle;
set
{
if (value)
{
- GridPointType = GridPointType.Cube;
- }
- }
- }
-
- ///
- /// 是否使用球形点类型
- ///
- public bool IsSpherePointType
- {
- get => _gridPointType == GridPointType.Sphere;
- set
- {
- if (value)
- {
- GridPointType = GridPointType.Sphere;
+ GridPointType = GridPointType.Rectangle;
}
}
}
@@ -162,14 +146,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels
///
/// 是否使用点状点类型
///
- public bool IsPointPointType
+ public bool IsCirclePointType
{
- get => _gridPointType == GridPointType.Point;
+ get => _gridPointType == GridPointType.Circle;
set
{
if (value)
{
- GridPointType = GridPointType.Point;
+ GridPointType = GridPointType.Circle;
}
}
}
@@ -547,7 +531,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
SelectedLogLevel = currentLevel.ToString();
// 设置默认网格点类型
- GridPointType = GridPointType.Cube;
+ GridPointType = GridPointType.Rectangle;
// 初始化系统信息
PluginVersion = "v1.0";
diff --git a/src/UI/WPF/Views/SystemManagementView.xaml b/src/UI/WPF/Views/SystemManagementView.xaml
index 3f2026c..34525cd 100644
--- a/src/UI/WPF/Views/SystemManagementView.xaml
+++ b/src/UI/WPF/Views/SystemManagementView.xaml
@@ -173,23 +173,17 @@ NavisworksTransport 系统管理页签视图 - 采用与其他页签一致的Nav
Orientation="Horizontal"
VerticalAlignment="Center"
Margin="5,0,0,0">
-
-
-
+ ToolTip="显示圆形网格点"/>