Skip to content

Commit 9bb5368

Browse files
committed
Implement memory loading for BG NSphere
1 parent 7c23b33 commit 9bb5368

File tree

2 files changed

+66
-9
lines changed

2 files changed

+66
-9
lines changed

solution/GraphicalDebugging/ExpressionDrawer.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,13 +289,20 @@ public void Draw(Geometry.Box box, Graphics graphics, Settings settings, Geometr
289289
}
290290
else // Radian, Degree
291291
{
292+
292293
if (rx == 0 || ry == 0)
293294
drawer.DrawPeriodicPoint(cs, Center, box, traits.Unit, settings.showDots);
294295
else
295296
{
296297
Drawer.PeriodicDrawableNSphere pd = new Drawer.PeriodicDrawableNSphere(cs, this, traits.Unit);
297298
Geometry.Interval interval = RelativeEnvelopeLon(this, traits.Unit);
298-
drawer.DrawPeriodic(cs, box, interval, traits.Unit, pd, true, false, settings.showDots);
299+
try
300+
{
301+
drawer.DrawPeriodic(cs, box, interval, traits.Unit, pd, true, false, settings.showDots);
302+
} catch (Exception e)
303+
{
304+
int a = 10;
305+
}
299306
}
300307
}
301308
}

solution/GraphicalDebugging/ExpressionLoader.cs

Lines changed: 58 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,20 @@ public override ExpressionDrawer.IDrawable DrawableFromMemory(MemoryReader.Conve
764764
}
765765

766766
abstract class NSphereLoader : GeometryLoader<ExpressionDrawer.NSphere>
767-
{ }
767+
{
768+
public override ExpressionDrawer.IDrawable DrawableFromMemory(MemoryReader.Converter<double> converter,
769+
double[] values, int offset)
770+
{
771+
int valCount = converter.ValueCount();
772+
if (valCount == 3)
773+
{
774+
var c = new ExpressionDrawer.Point(values[offset], values[offset + 1]);
775+
var r = values[offset + 2];
776+
return new ExpressionDrawer.NSphere(c, r);
777+
}
778+
return null;
779+
}
780+
}
768781

769782
abstract class RangeLoader<ResultType> : GeometryLoader<ResultType>
770783
where ResultType : ExpressionDrawer.IDrawable
@@ -1158,22 +1171,35 @@ public Loader Create(Loaders loaders, Debugger debugger, string name, string typ
11581171
return null;
11591172

11601173
string m_center = name + ".m_center";
1174+
string m_radius = name + ".m_radius";
11611175

11621176
string pointType = tparams[0];
11631177
PointLoader pointLoader = loaders.FindByType(ExpressionLoader.Kind.Point,
11641178
m_center,
11651179
pointType) as PointLoader;
1166-
if (pointLoader == null)
1167-
return null;
11681180

1169-
return new BGNSphere(pointLoader, pointType);
1181+
string radiusType = tparams[1];
1182+
1183+
return pointLoader != null
1184+
&& debugger.GetTypeSizeof(type, out int sizeOf)
1185+
&& debugger.GetAddressOffset(name, m_center, out long centerDiff)
1186+
&& debugger.GetAddressOffset(name, m_radius, out long radiusDiff)
1187+
&& debugger.GetCppSizeof(radiusType, out int radiusSize)
1188+
&& !Debugger.IsInvalidOffset(sizeOf, centerDiff, radiusDiff)
1189+
? new BGNSphere(pointLoader, pointType, radiusType, radiusSize, sizeOf, centerDiff, radiusDiff)
1190+
: null;
11701191
}
11711192
}
11721193

1173-
private BGNSphere(PointLoader pointLoader, string pointType)
1194+
private BGNSphere(PointLoader pointLoader, string pointType, string radiusType, int radiusSize, int sizeOf, long centerDiff, long radiusDiff)
11741195
{
11751196
this.pointLoader = pointLoader;
11761197
this.pointType = pointType;
1198+
this.radiusType = radiusType;
1199+
this.radiusSize = radiusSize;
1200+
this.sizeOf = sizeOf;
1201+
this.centerDiff = centerDiff;
1202+
this.radiusDiff = radiusDiff;
11771203
}
11781204

11791205
public override Geometry.Traits GetTraits(MemoryReader mreader, Debugger debugger,
@@ -1189,18 +1215,42 @@ public override ExpressionDrawer.IDrawable Load(MemoryReader mreader, Debugger d
11891215
string m_center = name + ".m_center";
11901216
string m_radius = name + ".m_radius";
11911217

1192-
Geometry.Point center = pointLoader.LoadPoint(mreader, debugger,
1193-
m_center, pointType);
1194-
1218+
Geometry.Point center = pointLoader.LoadPoint(mreader, debugger, m_center, pointType);
11951219
bool ok = debugger.TryLoadDouble(m_radius, out double radius);
11961220

11971221
return Util.IsOk(center, ok)
11981222
? new ExpressionDrawer.NSphere(center, radius)
11991223
: null;
12001224
}
12011225

1226+
public override MemoryReader.Converter<double> GetMemoryConverter(MemoryReader mreader,
1227+
Debugger debugger, // TODO - remove
1228+
string name, string type)
1229+
{
1230+
// NOTE: In case it was created by derived class and these members set to invalid values
1231+
if (sizeOf <= 0
1232+
|| Debugger.IsInvalidOffset(sizeOf, centerDiff, radiusDiff))
1233+
return null;
1234+
1235+
string m_center = name + ".m_center";
1236+
MemoryReader.Converter<double> pointConverter = pointLoader.GetMemoryConverter(mreader, debugger, m_center, pointType);
1237+
if (pointConverter == null)
1238+
return null;
1239+
1240+
MemoryReader.Converter<double> radiusConverter = mreader.GetNumericConverter(radiusType, radiusSize);
1241+
1242+
return new MemoryReader.StructConverter<double>(sizeOf,
1243+
new MemoryReader.Member<double>(pointConverter, (int)centerDiff),
1244+
new MemoryReader.Member<double>(radiusConverter, (int)radiusDiff));
1245+
}
1246+
12021247
private readonly PointLoader pointLoader;
12031248
private readonly string pointType;
1249+
private readonly string radiusType;
1250+
private readonly int radiusSize;
1251+
private readonly long centerDiff;
1252+
private readonly long radiusDiff;
1253+
private readonly int sizeOf;
12041254
}
12051255

12061256
abstract class PointRange<ResultType> : RangeLoader<ResultType>

0 commit comments

Comments
 (0)