1
1

Compare commits

...

1 Commits

6 changed files with 418 additions and 0 deletions

View File

@@ -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)

View File

@@ -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()

View File

@@ -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()

View File

@@ -738,3 +738,8 @@ if(WITH_COMPILER_CCACHE)
set(WITH_COMPILER_CCACHE OFF)
endif()
endif()
if(WITH_OPENCASCADE)
find_package_wrapper(OpenCascade REQUIRED)
endif()

View File

@@ -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")

View File

@@ -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) {