Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 23 additions & 10 deletions download.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,34 @@ set -e # exit on first error
set -u # Treat unset variables as error
set -x # echo commands

version=128
version=${1:-129}
tar=ESP${version}-linux-x86_64.tgz

curl -O https://acdl.mit.edu/ESP/archive/${tar} -o ${tar}
# MIT rotates older releases from PreBuilts/ to archive/
prebuilts_url=https://acdl.mit.edu/ESP/PreBuilts/${tar}
archive_url=https://acdl.mit.edu/ESP/archive/${tar}

if curl --head --silent --fail "$prebuilts_url" > /dev/null 2>&1; then
curl -O "$prebuilts_url" -o ${tar}
elif curl --head --silent --fail "$archive_url" > /dev/null 2>&1; then
echo "Not found in PreBuilts, downloading from archive"
curl -O "$archive_url" -o ${tar}
else
echo "ERROR: ESP${version} not found in PreBuilts or archive" >&2
exit 1
fi

rm -rf ESP ESP${version}
tar xzf ${tar}
mv ESP${version} ESP

# Replace evaluate.c with a custom version for ESP128 to fix
# add periodic parameter support to EG_splinePCDeriv
# Version-specific source patches
if [ "$version" = "128" ]; then
echo "Version is 128: copying replace128evaluate.c to ESP${version}/EngSketchPad/src/EGADS/util/evaluate.c"
cp replace128evaluate.c ESP${version}/EngSketchPad/src/EGADS/util/evaluate.c
else
echo "Version is ${version} (not 128): skipping replace128evaluate.c copy"
echo "Patching ESP128: evaluate.c (periodic parameter support for EG_splinePCDeriv)"
cp replace128evaluate.c ESP/EngSketchPad/src/EGADS/util/evaluate.c
fi
if [ "$version" = "129" ]; then
echo "Patching ESP129: EGADS try/catch for OCC calls (FXC-6881), null surface checks"
patch -p0 < egadsTopo129.patch
patch -p0 < egadsIO129.patch
fi

mv ESP${version} ESP
108 changes: 108 additions & 0 deletions egadsIO129.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
--- ESP/EngSketchPad/src/EGADS/src/egadsIO.cpp 2026-03-06 20:22:39.000000000 +0000
+++ ESP/EngSketchPad/src/EGADS/src/egadsIO.cpp 2026-04-15 13:40:55.990286766 +0000
@@ -105,7 +105,7 @@
#endif


-//#define INTERIM
+#define INTERIM

#define UVTOL 1.e-4

@@ -2665,6 +2665,20 @@
egadsBody *pbody = (egadsBody *) obj->blind;
pbody->shape = Exp.Current();
if (egads == 0) {
+ TopTools_IndexedMapOfShape FaceMap;
+ TopExp::MapShapes(pbody->shape, TopAbs_FACE, FaceMap);
+ int nNullSurf = 0;
+ for (int iFace = 1; iFace <= FaceMap.Extent(); iFace++) {
+ TopoDS_Face Face = TopoDS::Face(FaceMap(iFace));
+ Handle(Geom_Surface) hSurface = BRep_Tool::Surface(Face);
+ if (hSurface.IsNull()) nNullSurf++;
+ }
+ if (nNullSurf != 0) {
+/* printf(" EGADS Warning: Body %d has %d NULL Surfaces of %d Faces\n",
+ i, nNullSurf, FaceMap.Extent()); */
+ if (invalid != NULL) invalid[i-1] = 2;
+ continue;
+ }
BRepCheck_Analyzer fCheck(pbody->shape);
if (!fCheck.IsValid()) {
try {
@@ -2701,6 +2715,20 @@
egadsBody *pbody = (egadsBody *) obj->blind;
pbody->shape = Exp.Current();
if (egads == 0) {
+ TopTools_IndexedMapOfShape FaceMap;
+ TopExp::MapShapes(pbody->shape, TopAbs_FACE, FaceMap);
+ int nNullSurf = 0;
+ for (int iFace = 1; iFace <= FaceMap.Extent(); iFace++) {
+ TopoDS_Face Face = TopoDS::Face(FaceMap(iFace));
+ Handle(Geom_Surface) hSurface = BRep_Tool::Surface(Face);
+ if (hSurface.IsNull()) nNullSurf++;
+ }
+ if (nNullSurf != 0) {
+/* printf(" EGADS Warning: Body %d has %d NULL Surfaces of %d Faces\n",
+ i, nNullSurf, FaceMap.Extent()); */
+ if (invalid != NULL) invalid[i-1] = 2;
+ continue;
+ }
BRepCheck_Analyzer sCheck(pbody->shape);
if (!sCheck.IsValid()) {
try {
@@ -2743,6 +2771,20 @@
egadsBody *pbody = (egadsBody *) obj->blind;
pbody->shape = Exp.Current();
if (egads == 0) {
+ TopTools_IndexedMapOfShape FaceMap;
+ TopExp::MapShapes(pbody->shape, TopAbs_FACE, FaceMap);
+ int nNullSurf = 0;
+ for (int iFace = 1; iFace <= FaceMap.Extent(); iFace++) {
+ TopoDS_Face Face = TopoDS::Face(FaceMap(iFace));
+ Handle(Geom_Surface) hSurface = BRep_Tool::Surface(Face);
+ if (hSurface.IsNull()) nNullSurf++;
+ }
+ if (nNullSurf != 0) {
+/* printf(" EGADS Warning: Body %d has %d NULL Surfaces of %d Faces\n",
+ i, nNullSurf, FaceMap.Extent()); */
+ if (invalid != NULL) invalid[i-1] = 2;
+ continue;
+ }
BRepCheck_Analyzer sCheck(pbody->shape);
if (!sCheck.IsValid()) {
try {
@@ -2780,6 +2822,24 @@
}
}
}
+ if (invalid != NULL) {
+ int nInvalid = 0;
+ for (j = 0; j < i; j++) if (invalid[j] == 2) nInvalid++;
+ if (nInvalid == i) {
+ printf(" EGADS Error: No Valid Bodies!\n");
+ source.Nullify();
+ for (i = 0; i < nBody; i++) {
+ egObject *obj = mshape->bodies[i];
+ egadsBody *pbody = (egadsBody *) obj->blind;
+ delete pbody;
+ EG_deleteObject(mshape->bodies[i]);
+ }
+ delete [] mshape->bodies;
+ delete mshape;
+ EG_free(invalid);
+ return EGADS_NODATA;
+ }
+ }

stat = EG_makeObject(context, &omodel);
if (stat != EGADS_SUCCESS) {
@@ -2823,7 +2883,7 @@
continue;
}
if (invalid != NULL)
- if (invalid[i] == 1)
+ if (invalid[i] != 0)
EG_attributeAdd(pobj, ".invalid", ATTRSTRING, 1, NULL, NULL, name);
mshape->bodies[j] = mshape->bodies[i];
j++;
Loading
Loading