diff options
author | YimingWu <xp8110@outlook.com> | 2021-12-25 17:23:41 +0300 |
---|---|---|
committer | YimingWu <xp8110@outlook.com> | 2021-12-25 17:23:41 +0300 |
commit | 581ca8f7639597f8e58294cef39ee3e13015dc78 (patch) | |
tree | 63c9fb63bcde72ebc7024195984c53e65d098ab6 | |
parent | d2bf60cc17a961789d7c415fc3d2af14afa50f62 (diff) |
Nurbs: Trying to get opencascade backend to make nurbs, not working yet.nurbs-opencascade
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | build_files/cmake/Modules/FindOpenCascade.cmake | 157 | ||||
-rw-r--r-- | build_files/cmake/macros.cmake | 4 | ||||
-rw-r--r-- | build_files/cmake/platform/platform_unix.cmake | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/CMakeLists.txt | 18 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/curve.cc | 232 |
6 files changed, 418 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c5b5eb317e..c1f31850807 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -699,6 +699,8 @@ if(UNIX AND NOT APPLE) mark_as_advanced(WITH_CXX11_ABI) endif() +option(WITH_OPENCASCADE "Enable opencascade for curve" ON) + # Installation process. option(POSTINSTALL_SCRIPT "Run given CMake script after installation process" OFF) mark_as_advanced(POSTINSTALL_SCRIPT) diff --git a/build_files/cmake/Modules/FindOpenCascade.cmake b/build_files/cmake/Modules/FindOpenCascade.cmake new file mode 100644 index 00000000000..0b5a9eeeba6 --- /dev/null +++ b/build_files/cmake/Modules/FindOpenCascade.cmake @@ -0,0 +1,157 @@ +# This script finds OpenCASCADE Technology libraries. +# The script requires: +# OpenCASCADE_DIR - root OCCT folder or folder with CMake configuration files +# +# Script will define the following variables on success: +# OpenCASCADE_FOUND - package is successfully found +# OpenCASCADE_INCLUDE_DIR - directory with headers +# OpenCASCADE_LIBRARY_DIR - directory with libraries for linker +# OpenCASCADE_BINARY_DIR - directory with DLLs +include(FindPackageHandleStandardArgs) + +# MY_PLATFORM variable +math (EXPR MY_BITNESS "32 + 32*(${CMAKE_SIZEOF_VOID_P}/8)") +if (WIN32) + set (MY_PLATFORM "win${MY_BITNESS}") +elseif(APPLE) + set (MY_PLATFORM "mac") +else() + set (MY_PLATFORM "lin") +endif() + +# MY_PLATFORM_AND_COMPILER variable +if (MSVC) + if (MSVC90) + set (MY_COMPILER vc9) + elseif (MSVC10) + set (MY_COMPILER vc10) + elseif (MSVC11) + set (MY_COMPILER vc11) + elseif (MSVC12) + set (MY_COMPILER vc12) + elseif (MSVC14) + set (MY_COMPILER vc14) + else() + set (MY_COMPILER vc15) + message (WARNING "Unknown msvc version. $$MY_COMPILER is used") + endif() +elseif (DEFINED CMAKE_COMPILER_IS_GNUCC) + set (MY_COMPILER gcc) +elseif (DEFINED CMAKE_COMPILER_IS_GNUCXX) + set (MY_COMPILER gcc) +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set (MY_COMPILER clang) +elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") + set (MY_COMPILER icc) +else() + set (MY_COMPILER ${CMAKE_GENERATOR}) + string (REGEX REPLACE " " "" COMPILER ${MY_COMPILER}) +endif() +set (MY_PLATFORM_AND_COMPILER "${MY_PLATFORM}/${MY_COMPILER}") + +set (OpenCASCADE_DIR "" CACHE PATH "Path to Open CASCADE libraries.") + +# default paths +set (OpenCASCADE_INCLUDE_DIR "${OpenCASCADE_DIR}/inc") +set (OpenCASCADE_LIBRARY_DIR "${OpenCASCADE_DIR}/${MY_PLATFORM_AND_COMPILER}/lib") +set (OpenCASCADE_BINARY_DIR "${OpenCASCADE_DIR}/${MY_PLATFORM_AND_COMPILER}/bin") + +# complete list of OCCT Toolkits (copy-paste from adm/UDLIST, since installed OCCT does not include UDLIST) +set (OpenCASCADE_TKLIST "") +set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKernel TKMath) # FoundationClasses +set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKG2d TKG3d TKGeomBase TKBRep) # ModelingData +set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKGeomAlgo TKTopAlgo TKPrim TKBO TKBool TKHLR TKFillet TKOffset TKFeat TKMesh TKXMesh TKShHealing) # ModelingAlgorithms +set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKService TKV3d TKOpenGl TKMeshVS TKIVtk TKD3DHost) # Visualization +set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKCDF TKLCAF TKCAF TKBinL TKXmlL TKBin TKXml TKStdL TKStd TKTObj TKBinTObj TKXmlTObj TKVCAF) # ApplicationFramework +set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKXSBase TKSTEPBase TKSTEPAttr TKSTEP209 TKSTEP TKIGES TKXCAF TKXDEIGES TKXDESTEP TKSTL TKVRML TKXmlXCAF TKBinXCAF TKRWMesh) # DataExchange +set (OpenCASCADE_TKLIST ${OpenCASCADE_TKLIST} TKDraw TKViewerTest) # Draw + +# validate location of OCCT libraries and headers +set (OpenCASCADE_INCLUDE_DIR_FOUND) +set (OpenCASCADE_LIBRARY_DIR_FOUND) +set (OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND) +set (OpenCASCADE_IMPLIB_SUFFIX ${CMAKE_STATIC_LIBRARY_SUFFIX}) +set (OpenCASCADE_SHAREDLIB_RELEASE_FOUND) +set (OpenCASCADE_SHAREDLIB_DEBUG_FOUND) +if (EXISTS "${OpenCASCADE_INCLUDE_DIR}/Standard.hxx") + set (OpenCASCADE_INCLUDE_DIR_FOUND ON) +endif() + +if (EXISTS "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_STATIC_LIBRARY_SUFFIX}") + set (OpenCASCADE_LIBRARY_DIR_FOUND ON) +elseif (NOT WIN32 AND EXISTS "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") + set (OpenCASCADE_LIBRARY_DIR_FOUND ON) + set (OpenCASCADE_IMPLIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) +endif() + +if (EXISTS "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_STATIC_LIBRARY_SUFFIX}") + set (OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND ON) +elseif (NOT WIN32 AND EXISTS "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") + set (OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND ON) + set (OpenCASCADE_IMPLIB_SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}) +elseif (OpenCASCADE_LIBRARY_DIR_FOUND) + message (STATUS "Only release OpenCASCADE libraries have been found") +endif() + +if (NOT OpenCASCADE_LIBRARY_DIR_FOUND AND OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND) + set (OpenCASCADE_LIBRARY_DIR_FOUND ON) + message (WARNING "Only debug OpenCASCADE libraries have been found") +endif() + +if (WIN32) + if (EXISTS "${OpenCASCADE_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") + set (OpenCASCADE_SHAREDLIB_RELEASE_FOUND ON) + endif() + if (EXISTS "${OpenCASCADE_BINARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") + set (OpenCASCADE_SHAREDLIB_DEBUG_FOUND ON) + endif() +else() + if (EXISTS "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") + set (OpenCASCADE_SHAREDLIB_RELEASE_FOUND ON) + endif() + if (EXISTS "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}TKernel${CMAKE_SHARED_LIBRARY_SUFFIX}") + set (OpenCASCADE_SHAREDLIB_DEBUG_FOUND ON) + endif() +endif() + +if (OpenCASCADE_INCLUDE_DIR_FOUND AND OpenCASCADE_LIBRARY_DIR_FOUND) + set (OpenCASCADE_FOUND ON) + set (OpenCASCADE_INSTALL_PREFIX ${OpenCASCADE_DIR}) + + # Define OCCT toolkits so that CMake can put absolute paths to linker; + # the library existance is not checked here, since modules can be disabled. + foreach (aLibIter ${OpenCASCADE_TKLIST}) + add_library (${aLibIter} SHARED IMPORTED) + + set_property (TARGET ${aLibIter} APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) + set_target_properties (${aLibIter} PROPERTIES IMPORTED_IMPLIB_RELEASE "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${OpenCASCADE_IMPLIB_SUFFIX}") + if (OpenCASCADE_SHAREDLIB_RELEASE_FOUND) + if (WIN32) + set_target_properties (${aLibIter} PROPERTIES IMPORTED_LOCATION_RELEASE "${OpenCASCADE_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${CMAKE_SHARED_LIBRARY_SUFFIX}") + else() + set_target_properties (${aLibIter} PROPERTIES IMPORTED_LOCATION_RELEASE "${OpenCASCADE_LIBRARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${CMAKE_SHARED_LIBRARY_SUFFIX}") + endif() + endif() + + if (OpenCASCADE_LIBRARY_DEBUG_DIR_FOUND) + set_property (TARGET ${aLibIter} APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG) + set_target_properties (${aLibIter} PROPERTIES IMPORTED_IMPLIB_DEBUG "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${OpenCASCADE_IMPLIB_SUFFIX}") + if (OpenCASCADE_SHAREDLIB_DEBUG_FOUND) + if (WIN32) + set_target_properties (${aLibIter} PROPERTIES IMPORTED_LOCATION_DEBUG "${OpenCASCADE_BINARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${CMAKE_SHARED_LIBRARY_SUFFIX}") + else() + set_target_properties (${aLibIter} PROPERTIES IMPORTED_LOCATION_DEBUG "${OpenCASCADE_LIBRARY_DIR}d/${CMAKE_SHARED_LIBRARY_PREFIX}${aLibIter}${CMAKE_SHARED_LIBRARY_SUFFIX}") + endif() + endif() + endif() + endforeach() +else() + # fallback searching for CMake configs + if (NOT "${OpenCASCADE_DIR}" STREQUAL "") + set (anOcctDirBak "${OpenCASCADE_DIR}") + find_package (OpenCASCADE CONFIG QUIET PATHS "${OpenCASCADE_DIR}" NO_DEFAULT_PATH) + set (OpenCASCADE_DIR "${anOcctDirBak}" CACHE PATH "Path to Open CASCADE libraries." FORCE) + else() + find_package (OpenCASCADE CONFIG QUIET) + endif() +endif() diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index 34c2c9a684d..81119b83316 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -596,6 +596,10 @@ function(SETUP_LIBDIRS) link_directories(${GMP_LIBPATH}) endif() + if(WITH_OPENCASCADE) + link_directories(${OpenCASCADE_LIBRARY_DIR}) + endif() + if(WIN32 AND NOT UNIX) link_directories(${PTHREADS_LIBPATH}) endif() diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 2f1a622c63d..8605e00684a 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -738,3 +738,8 @@ if(WITH_COMPILER_CCACHE) set(WITH_COMPILER_CCACHE OFF) endif() endif() + +if(WITH_OPENCASCADE) + find_package_wrapper(OpenCascade REQUIRED) +endif() + diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt index 02aef4ef79e..d57d24f98b2 100644 --- a/source/blender/blenkernel/CMakeLists.txt +++ b/source/blender/blenkernel/CMakeLists.txt @@ -791,6 +791,24 @@ if(WITH_GMP) ) endif() +if(WITH_OPENCASCADE) + add_definitions(-DWITH_OPENCASCADE) + + list(APPEND INC_SYS + ${OpenCASCADE_INCLUDE_DIR} + ) + SET(OpenCASCADE_LIBS + TKTObjDRAW.a TKQADraw.a TKXDEDRAW.a TKDCAF.a TKDCAF.a TKXSDRAW.a + TKViewerTest.a TKTopTest.a TKDraw.a TKXDESTEP.a TKBinXCAF.a TKXmlXCAF.a TKXDEIGES.a TKXCAF.a TKIGES.a TKSTEP.a TKSTEP209.a TKSTEPAttr.a + TKSTEPBase.a TKXSBase.a TKStd.a TKStdL.a TKSTL.a TKXml.a TKBin.a TKXmlL.a TKBinL.a TKCAF.a TKXCAF.a TKLCAF.a TKCDF.a TKMeshVS.a TKOpenGl.a TKV3d.a TKService.a + TKXMesh.a TKMesh.a TKOffset.a TKFeat.a TKFillet.a TKHLR.a TKBool.a TKBO.a TKShHealing.a TKPrim.a TKTopAlgo.a TKGeomAlgo.a TKBRep.a + TKGeomBase.a TKG3d.a TKG2d.a TKMath.a TKernel.a + ) + list(APPEND LIB + ${OpenCASCADE_LIBS} + ) +endif() + # # Warnings as errors, this is too strict! # if(MSVC) # string(APPEND CMAKE_C_FLAGS " /WX") diff --git a/source/blender/blenkernel/intern/curve.cc b/source/blender/blenkernel/intern/curve.cc index dc2527f9b62..bee9a9ea923 100644 --- a/source/blender/blenkernel/intern/curve.cc +++ b/source/blender/blenkernel/intern/curve.cc @@ -67,6 +67,35 @@ #include "BLO_read_write.h" +/* opencascade includes */ + +#include <IGESCAFControl_Reader.hxx> +#include <STEPCAFControl_Reader.hxx> +#include <Standard_Stream.hxx> +#include <Standard_TypeDef.hxx> +#include <StlAPI_Writer.hxx> +#include <iostream> + +#include <IMeshData_Status.hxx> +#include <IMeshTools_Parameters.hxx> + +#include <BRepBuilderAPI.hxx> +#include <BRepTools.hxx> +#include <BRep_Tool.hxx> +#include <Geom_BSplineSurface.hxx> +#include <TColStd_Array1OfInteger.hxx> +#include <TColStd_Array1OfReal.hxx> +#include <TColgp_Array2OfPnt.hxx> +#include <TopoDS.hxx> +#include <TopoDS_Iterator.hxx> +#include <TopoDS_Vertex.hxx> + +#include <BRepMesh_IncrementalMesh.hxx> +#include <Geom_BSplineCurve.hxx> +#include <Geom_Curve.hxx> +#include <Geom_TrimmedCurve.hxx> +#include <NCollection_Array1.hxx> + /* globals */ /* local */ @@ -1391,6 +1420,209 @@ void BKE_nurb_makeFaces(const Nurb *nu, float *coord_array, int rowstride, int r return; } + /* An example code I got somewhere on the Internet, this works... */ + + TColgp_Array2OfPnt poles(0, 7, 0, 5); // ucol,vrow + TColStd_Array1OfReal UKnots(0, 12); + TColStd_Array1OfReal VKnots(0, 10); + + TColStd_Array1OfReal UKnots1(0, 5); + TColStd_Array1OfReal VKnots1(0, 3); + UKnots1.SetValue(0, 0); + UKnots1.SetValue(1, 1); + UKnots1.SetValue(2, 2); + UKnots1.SetValue(3, 3); + UKnots1.SetValue(4, 4); + UKnots1.SetValue(5, 5); + VKnots1.SetValue(0, 0); + VKnots1.SetValue(1, 1); + VKnots1.SetValue(2, 2); + VKnots1.SetValue(3, 3); + TColStd_Array1OfInteger UMults(0, 5); + UMults.SetValue(0, 4); + UMults.SetValue(1, 1); + UMults.SetValue(2, 1); + UMults.SetValue(3, 1); + UMults.SetValue(4, 1); + UMults.SetValue(5, 4); + TColStd_Array1OfInteger VMults(0, 3); + VMults.SetValue(0, 4); + VMults.SetValue(1, 1); + VMults.SetValue(2, 1); + VMults.SetValue(3, 4); + int n = 7; //(ctr pnts-1) + int k = 4; // degree+1 + int n1 = 5; + int k1 = 4; + int t = 0; + int a = 0; + int b = 0; + + for (int j = 0; j <= n + k; j++) { + if (j < k) { + t = 0; + a++; + UKnots.SetValue(a, t); + } + + if (k <= j && j <= n) { + t = j - k + 1; + a++; + UKnots.SetValue(a, t); + } + + if (j > n) { + t = n - k + 2; + a++; + UKnots.SetValue(a, t); + } + } + UKnots.SetValue(a, t); + + for (int s = 0; s <= n1 + k1; s++) { + if (s < k1) { + t = 0; + b++; + VKnots.SetValue(b, t); + } + + if (k1 <= s && s <= n1) { + t = s - k1 + 1; + b++; + VKnots.SetValue(b, t); + } + + if (s > n1) { + t = n1 - k1 + 2; + b++; + VKnots.SetValue(b, t); + } + } + /* + knots = [knots ; t]; + end + + knots_matrix = knots; + */ + // gp_Pnt P; + // poles.SetValue(1,1,P); + // poles.SetValue(1,1,P); + poles.SetValue(0, 0, gp_Pnt(0, 0, 0)); + poles.SetValue(1, 0, gp_Pnt(0.4, 0, 0)); + poles.SetValue(2, 0, gp_Pnt(0.8, 0, 0)); + poles.SetValue(3, 0, gp_Pnt(1.2, 0, 0)); + poles.SetValue(4, 0, gp_Pnt(1.6, 0, 0)); + poles.SetValue(5, 0, gp_Pnt(2.0, 0, 0)); + poles.SetValue(6, 0, gp_Pnt(2.5, 0, 0)); + poles.SetValue(7, 0, gp_Pnt(3, 0, 0)); + + poles.SetValue(0, 1, gp_Pnt(0, 0.4, 0)); + poles.SetValue(1, 1, gp_Pnt(0.4, 0.4, 0.2)); + poles.SetValue(2, 1, gp_Pnt(0.8, 0.4, 0.3)); + poles.SetValue(3, 1, gp_Pnt(1.2, 0.4, 0.1)); + poles.SetValue(4, 1, gp_Pnt(1.6, 0.4, 0)); + poles.SetValue(5, 1, gp_Pnt(2.0, 0.4, 0.2)); + poles.SetValue(6, 1, gp_Pnt(2.5, 0.4, 0.1)); + poles.SetValue(7, 1, gp_Pnt(3, 0.4, 0)); + + poles.SetValue(0, 2, gp_Pnt(0, 0.8, 0)); + poles.SetValue(1, 2, gp_Pnt(0.4, 0.8, 0.5)); + poles.SetValue(2, 2, gp_Pnt(0.8, 0.8, 0.6)); + poles.SetValue(3, 2, gp_Pnt(1.2, 0.8, 0.2)); + poles.SetValue(4, 2, gp_Pnt(1.6, 0.8, 0.0)); + poles.SetValue(5, 2, gp_Pnt(2.0, 0.8, 0)); + poles.SetValue(6, 2, gp_Pnt(2.5, 0.8, 0.3)); + poles.SetValue(7, 2, gp_Pnt(3, 0.8, 0)); + + poles.SetValue(0, 3, gp_Pnt(0, 1.2, 0)); + poles.SetValue(1, 3, gp_Pnt(0.4, 1.2, 0.4)); + poles.SetValue(2, 3, gp_Pnt(0.8, 1.2, 0.4)); + poles.SetValue(3, 3, gp_Pnt(1.2, 1.2, 0.2)); + poles.SetValue(4, 3, gp_Pnt(1.6, 1.2, 0.0)); + poles.SetValue(5, 3, gp_Pnt(2.0, 1.2, 0.0)); + poles.SetValue(6, 3, gp_Pnt(2.5, 1.2, 0.5)); + poles.SetValue(7, 3, gp_Pnt(3, 1.2, 0)); + + poles.SetValue(0, 4, gp_Pnt(0, 1.6, 0)); + poles.SetValue(1, 4, gp_Pnt(0.4, 1.6, 0.3)); + poles.SetValue(2, 4, gp_Pnt(0.8, 1.6, 0.2)); + poles.SetValue(3, 4, gp_Pnt(1.2, 1.6, 0.1)); + poles.SetValue(4, 4, gp_Pnt(1.6, 1.6, 0.3)); + poles.SetValue(5, 4, gp_Pnt(2.0, 1.6, 0.2)); + poles.SetValue(6, 4, gp_Pnt(2.5, 1.6, 0.1)); + poles.SetValue(7, 4, gp_Pnt(3, 1.6, 0)); + + poles.SetValue(0, 5, gp_Pnt(0, 2.0, 0)); + poles.SetValue(1, 5, gp_Pnt(0.4, 2.0, 0)); + poles.SetValue(2, 5, gp_Pnt(0.8, 2.0, 0)); + poles.SetValue(3, 5, gp_Pnt(1.2, 2.0, 0)); + poles.SetValue(4, 5, gp_Pnt(1.6, 2.0, 0)); + poles.SetValue(5, 5, gp_Pnt(2.0, 2.0, 0)); + poles.SetValue(6, 5, gp_Pnt(2.5, 2.0, 0)); + poles.SetValue(7, 5, gp_Pnt(3, 2.0, 0)); + + Geom_BSplineSurface Surf(poles, + UKnots1, + VKnots1, + UMults, + VMults, + 3, + 3, + Standard_False, + Standard_False); // = new Geom_BSplineSurface(); + // TopoDS_Shape sh=Surf; + // Handle(Geom_Surf) plz= new Geom_Surf(Surf); + // Handle (AIS_Shape) ais= new AIS_Shape(sh); + // Surf.Bounds(0,2,0,1); + // myAISContext->DisplayAll(1,1);//>Display(Surf); + + /* XXXXX: My code does not work........ */ + /* try to get cascade surface construction to work... not yet working it will crash. */ + + TColgp_Array2OfPnt poles = TColgp_Array2OfPnt(0, nu->pntsu, 0, nu->pntsv); + TColStd_Array1OfReal uknots = TColStd_Array1OfReal(0, nu->orderu + nu->pntsu); + TColStd_Array1OfReal vknots = TColStd_Array1OfReal(0, nu->orderv + nu->pntsv); + TColStd_Array1OfInteger umults = TColStd_Array1OfInteger(0, nu->orderu + nu->pntsu); + TColStd_Array1OfInteger vmults = TColStd_Array1OfInteger(0, nu->orderv + nu->pntsv); + for (int u = 0; u < nu->pntsu; u++) { + for (int v = 0; v < nu->pntsv; v++) { + BPoint *bp = &nu->bp[u * nu->pntsu + v]; + poles.SetValue(u, v, gp_Pnt(bp->vec[0], bp->vec[1], bp->vec[2])); + printf("pt uv %d %d %f %f %f\n ", u, v, bp->vec[0], bp->vec[1], bp->vec[2]); + } + } + printf("pts uv %d %d\n ", nu->pntsu, nu->pntsv); + printf("order uv %d %d\n ", nu->orderu, nu->orderv); + for (int u = 0; u < nu->orderu + nu->pntsu; u++) { + uknots.SetValue(u, nu->knotsu[u]); + printf("%f ", nu->knotsu[u]); + } + printf("\n"); + for (int v = 0; v < nu->orderv + nu->pntsv; v++) { + vknots.SetValue(v, nu->knotsv[v]); + printf("%f ", nu->knotsv[v]); + } + printf("\n"); + for (int u = 0; u < nu->orderu + nu->pntsu; u++) { + umults.SetValue(u, 0); + } + umults.SetValue(0, 4); + umults.SetValue(nu->orderu + nu->pntsu - 1, 4); + for (int v = 0; v < nu->orderv + nu->pntsv; v++) { + vmults.SetValue(v, 0); + } + vmults.SetValue(0, 4); + vmults.SetValue(nu->orderv + nu->pntsv - 1, 4); + Geom_BSplineSurface surface = Geom_BSplineSurface(poles, + uknots, + vknots, + umults, + vmults, + nu->orderu - 1, + nu->orderv - 1, + Standard_False, + Standard_False); + /* allocate and initialize */ len = totu * totv; if (len == 0) { |