STP在线查看器主要用于在线查看和预览STP(STEP)格式的文件,这些文件是三维图形数据,基于ASCII格式,并遵循ISO 10303-21标准的正文编码的交换结构。STP在线查看器的核心功能是将STP文件转换为适合在线展示的格式,从而使用户能够在网页浏览器中直接查看和交互这些三维图形数据。
让复杂的3D数据变得触手可及
在机加工或相关行业中,STP/STEP文件是不可或缺的一部分。这些文件不仅包含了复杂的三维模型数据,更是您项目成功的关键。但如何高效、准确地解析和预览这些文件,一直是许多工程师和技术人员面临的挑战。
现在,我们为您带来了stpViewer——一款功能强大、操作简便的3D模型解析与预览软件。它将帮助您轻松应对各种3D文件处理需求,让您的工作更加高效、流畅。
核心优势
为何选择stpViewer?
stpViewer 服务的所有必需文件资源打包在一个名为 stpViewer_service.zip 的压缩包中。解压后,您将获得以下文件列表:
序号 | 文件名称 | 类型 | 备注 |
---|---|---|---|
1 | tiny-3dconvert-server1.1.tar | 文件 | Tiny_3DConvert Server Docker镜像压缩包 |
2 | tiny-fileimport-latest.tar | 文件 | Tiny_FileImport 最新 Docker镜像压缩包 |
3 | docker-compose.yml | 文件 | Docker Compose 配置示例文件 |
4 | init.sql | 文件 | 数据库初始化脚本 |
5 | tinydata | 文件夹 | 数据配置文件夹,存放各服务所需数据文件的路径配置 |
6 | nsdtlock | 文件 | Linux命令行工具,用于验证LICENSE并解锁服务 |
7 | tiny-viewer.js | 文件 | 3D模型预览JavaScript版SDK |
stpViewer 是一个轻量级的3D服务平台,采用 Docker 容器化技术进行部署。整个运行环境由以下4个子服务组成:
在开始部署前,请确保已安装并配置好 Docker 和 Docker Compose 环境。首先创建一个新的文件夹并将解压后的资源 1-6 复制到该文件夹中。对于未提供的 postgres 和 minIo 镜像,可直接从官方拉取;而 tiny-3dconvert-server 和 tiny-fileimport 可通过导入镜像文件构建,操作步骤如下:
拉取官方镜像:
# 拉取postgres镜像
docker pull postgres:13.1-alpine
# 拉取minIo镜像
docker pull minio/minio
导入自定义镜像:
# 导入tiny-3dconvert-server镜像
docker load -i tiny-3dconvert-server1.1.tar
# 导入tiny-fileimport镜像
docker load -i tiny-fileimport-latest.tar
确认镜像构建成功,请运行 docker images
命令,若显示包含以下四个镜像,则表明镜像构建成功。
在部署tiny-3dconvert服务之前,您需要获取有效的license。在资源文件中有一个nsdtlock的命令行工具,该工具负责验证授权和解锁等工作。具体做法是需要将该工具运行起来,运行3个命令,如下:
chmod +x nsdtlock
nohup ./nsdtlock > nsdtlock.log 2>&1 &
iptables -I INPUT -p tcp --dport 5555 -j ACCEPT
运行完成之后,该命令行会产生一个machine mac的码,使用如下命令查看码:
tail -f 200 nsdtlock.log
将machine mac码复制,发给tiny-server的客服人员,他会给你一个LICENSE,然后将LICENSE配置到docker-compose.yaml/tiny-3dconvert-server/environment/LICENSE_CODE
,并且在MAC_IP
配置项中配置docker容器宿主机的ip地址。
另外nsdtlock这个命令行工具产生的进程不要杀掉,请保持运行直到服务已经完成启动、并且通过了授权验证,或者干脆让此进程一直运行。
下一步是基于这些镜像构建容器和服务,详情请参阅 第2章 “部署”部分的内容。
docker-compose.yaml 文件中提供了四个容器的配置示例,大部分配置无需更改,但请注意标记需要修改的部分。具体配置示例如下:
version: "3.5"
services:
tiny-postgres:
image: "postgres:13.1-alpine"
restart: always
environment:
POSTGRES_DB: tiny_3dconvert
POSTGRES_USER: tiny3dconvert
POSTGRES_PASSWORD: tiny3dconvert
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone
- ./tinydata/postgres-data:/var/lib/postgresql/data/
ports:
- "7432:5432"
tiny-minio:
image: "minio/minio"
command: server /data --console-address ":9002"
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone
- ./tinydata/minio-data:/data
ports:
- "9900:9000"
- "9002:9002"
tiny-fileimport-service:
image: registry.cn-hangzhou.aliyuncs.com/nsdt/tiny-fileimport
container_name: tiny-fileimport-service
restart: always
privileged: true
ulimits:
core: 0
volumes:
- ./tinydata/tiny-fileimport-service/.env:/fileimport-service/.env
- /etc/localtime:/etc/localtime:ro
environment:
TZ: "Asia/Shanghai"
DEBUG: "fileimport-service:*"
# 根据实际情况进行配置
PG_CONNECTION_STRING: "postgres://tiny3dconvert:tiny3dconvert@ip:7432/tiny_3dconvert"
WAIT_HOSTS: postgres:7432
# 根据实际情况进行配置
S3_ENDPOINT: "http://ip:9900"
S3_ACCESS_KEY: "minioadmin"
S3_SECRET_KEY: "minioadmin"
S3_BUCKET: "speckle-server"
#根据实际情况进行配置
LICENSE_CODE: "xxxLICENSE_CODE"
# 根据实际情况进行配置
TINY_SERVER_URL: "http://ip:5500"
tiny-3dconvert-server:
container_name: tiny-3dconvert-server
image: nsdt/tiny-3dconvert-server:1.1
ports:
- "5500:3000"
environment:
TZ: "Asia/Shanghai"
NODE_ENV: "production"
PORT: 3000
BIND_ADDRESS: "0.0.0.0"
CANONICAL_URL: "http://127.0.0.1:3000"
# 根据实际情况进行配置
S3_ENDPOINT: "http://ip:9900"
S3_ACCESS_KEY: "minioadmin"
S3_SECRET_KEY: "minioadmin"
S3_BUCKET: "speckle-server"
S3_CREATE_BUCKET: true
FILE_SIZE_LIMIT_MB: 500
# 根据实际情况进行配置
POSTGRES_URL: "postgres://tiny3dconvert:tiny3dconvert@ip:7432/tiny_3dconvert"
POSTGRES_MAX_CONNECTIONS_SERVER: 10
# 根据实际情况进行配置
LICENSE_CODE: ""
MAC_IP: "172.16.0.245"
WAIT_HOSTS: tiny-postgres:7432, minio:9900
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- ./tinydata/tinylogs:/app/logs
在配置过程中,请根据实际环境需求,正确设置与 postgres、minIo、tiny-fileimport-service 和 tiny-3dconvert-server 相关的环境变量和连接信息。
构建数据库容器
不修改配置的情况下,可以使用以下命令构建 PostgreSQL 容器:
docker-compose up -d tiny-postgres
初始化数据库表
连接至数据库(初始数据库名:tiny_3dconvert
,用户名:tiny3dconvert
,密码:tiny3dconvert
),执行 init.sql 初始化脚本以完成数据库表结构初始化。如下:
构建 minIo 容器同样简便,只需运行以下命令:
docker-compose up -d tiny-minio
tiny-fileimport-service 和 tiny-3dconvert-server 服务分别依赖于数据库、minIo 服务,并需要配置正确的环境变量。请确保在 docker-compose.yaml 中相应服务下的配置项,如 PG_CONNECTION_STRING、POSTGRES_URL、S3_ENDPOINT、TINY_SERVER_URL 等均设置准确无误。
构建两个服务的命令分别为:
docker-compose up -d tiny-fileimport-service
docker-compose up -d tiny-3dconvert-server
使用docker logs tiny-3dconvert-server -f
命令查看服务日志,看到如下界面说明LICENSE验证成功、整个服务构成功。。
接口名称:文件上传
接口URL:${BASE_URL}/api/file/:fileType/:streamId
HTTP 方法:POST
描述:该接口用于上传指定类型的3D文件至指定的工作空间(streamId)。
请求参数:
"stp"
、"step"
等3D文件格式。3fe0ed8b68
。multipart/form-data
,用于上传文件内容。响应参数:
响应体示例(成功):
{
"uploadResults": [
{
"blobId": "037d715265",
"fileName": "J1.STEP",
"uploadStatus": 1,
"fileSize": 2213080,
"formKey": "file"
}
]
}
接口名称:查询文件详情
接口URL:${BASE_URL}/api/file/filecommit/:fileId
HTTP 方法:GET
描述:此接口用于查询单个文件的详细信息,包括转换状态和错误信息等。
请求参数:
响应参数:
响应体示例(成功):
{
"fileId": "037d715265",
"commitId": "2660129011",
"referencedObject": "9b3156401e480189c443aebef6985157",
"uploadComplete": true,
"uploadDate": "2024-03-01T02:57:36.997Z",
"convertedStatus": 2,
"convertedLastUpdate": "2024-03-01T02:57:54.008Z",
"comment": null,
"convertedMessage": "File converted successfully"
}
接口名称:下载源文件
接口URL:${BASE_URL}/api/stream/:streamId/blob/:fileId
HTTP 方法:GET
描述:此接口用于下载指定文件,通过工作空间ID和文件ID获取原始文件内容。
请求参数:
响应参数:
接口名称:分页查询文件列表
接口URL:${BASE_URL}/api/file/list
HTTP 方法:POST
描述:此接口用于按条件分页查询文件列表,返回每个文件的详细信息。
请求参数:
YYYY-MM-DD HH:mm:ss
。响应参数:
响应体示例(成功):
{
"code": 0,
"data": {
"total": [
{
"count": "70"
}
],
"list": [
{
"id": "bf49015de5",
"streamId": "fbdb0ea035",
"branchName": "main",
"userId": "58743da94c",
"fileName": "Myinhe.fbx.zip",
"fileType": "fbx",
"fileSize": 2532192,
"uploadComplete": true,
"uploadDate": "2024-03-01T03:15:24.584Z",
"convertedStatus": 2,
"convertedLastUpdate": "2024-03-01T03:15:37.218Z",
"convertedMessage": "File converted successfully",
"convertedCommitId": "11aadfbdda",
}
]
}
}
tiny-viewer.js SDK 是3D模型查看器组件,方便开发者集成到Web应用中,实现快速加载和展示3D模型的功能。
示例代码
// 引入tiny-viewer.js SDK
import TinyViewer from './src/tiny-viewer.js';
async function load3dModal() {
const baseUrl = 'https://tinyconvert.sever.com'
// 创建Viewer实例
const viewer = new TinyViewer('#viewer-container', { baseUrl });
// 初始化
await viewer.init();
// 加载模型
const fileId = 'xxxxxxx'
await viewer.loadObjectByFileId(fileId,{ enableCaching: false })
// 注册事件监听器
viewer.on('load-progress', (e) => {
console.log('模型加载进度', e);
});
}
load3dModal()
const viewer = new TinyViewer(container: HTMLElement, params: ViewerParams);
container
: TinyViewer绑定的HTML元素
params: ViewerParams tinyViewer配置
interface ViewerParams {
baseUrl: string
showStats?: boolean
environmentSrc?: Asset | string
verbose: boolean
}
baseUrl
: tiny_3dconvert服务端地址,这个是必须的showStats
: 启用/禁用viewer画布左上角的统计窗口environmentSrc
: 允许用户为viewer场景定义环境纹理,形式为equirectangular HDRIverbose
: 在控制台中显示其他信息和警告。在开始使用viewer之前,您需要像下面这样对其进行初始化:
await viewer.init()
该函数是异步的,因为在这一步骤中,viewer要么加载所需的资产(如您可能在params
中提供的HDRI),要么生成运行时资产。
on(eventType: ViewerEvent, handler: (arg) => void)
eventType
: ViewerEvent
enum ViewerEvent {
ObjectClicked = 'object-clicked',
ObjectDoubleClicked = 'object-doubleclicked',
DownloadComplete = 'download-complete'
LoadComplete = 'load-complete',
LoadProgress = 'load-progress',
LoadCancelled = 'load-cancelled',
UnloadComplete = 'unload-complete',
UnloadAllComplete = 'unload-all-complete',
Busy = 'busy',
SectionBoxChanged = 'section-box-changed'
SectionBoxUpdated = 'section-box-updated'
}
handler
: 回调函数
TinyViewer通过文件id加载存储在服务端的模型
loadObject(fileId: string, {enableCaching?: boolean}): Promise<void>
fileId
: 模型对应的文件idenableCaching
: 启用/禁用浏览器中的数据缓存。默认为true卸载模型
unloadObject(): Promise<void>
setView(view: CanonicalView)
用于操作相机的视角
view: CanonicalView:
type CanonicalView =
| 'front'
| 'back'
| 'up'
| 'top'
| 'down'
| 'bottom'
| 'right'
| 'left'
| '3d'
| '3D'
toggleCameraProjection()
toggleZXAxisUpFixed()
设置模型选中并且高亮
selectObjects(objects:[]<objectId>);
objects
: objectId集合当用户在viewer中点击某个3d对象时,监听ObjectClicked
或ObjectDoubleClicked
事件的回调函数会收到SelectionEvent
信息:
type SelectionEvent = {
multiple: boolean
event?: PointerEvent
hits: Array<{
guid?: string
object: Record<string, unknown>
point: Vector3
}>
}
null
作为参数触发 ObjectClicked
事件作为一个简单的例子,在单击对象时将其高亮并且聚焦:
viewer.on(ViewerEvent.ObjectClicked, (selectionInfo: SelectionEvent) => {
if (selectionInfo) {
// 选中对象 并且高亮对象
viewer.selectObjects([selectionInfo.hits[0].object.id])
// 对象聚焦
viewer.zoom([selectionInfo.hits[0].object.id ])
}
else {
//没有点击的对象。聚焦整个场景
viewer.zoom()
}
})
tiny-viewer提供了一个可配置的剪切盒功能,可用于查看场景的部分内容。
setSectionBox(
box?: {
min: { x: number; y: number; z: number }
max: { x: number; y: number; z: number }
},
offset?: number
)
使用即时盒子定义设置切割盒的尺寸。
box
:切割盒尺寸的盒子定义。如果未提供此参数,则切割盒将调整为整个场景大小。offset
:用于增加/减小切割盒的可选乘数,默认为0.05
。setSectionBoxFromObjects(objectIds: string[], offset?: number)**
根据一组对象设置切割盒的尺寸。
objectIds
:我们希望调整切割盒的对象ID。切割盒的尺寸将是其组合轴对齐边界框的结果。offset
:用于增加/减小切割盒的可选乘数,默认为0.05
。启用切割盒。
sectionBoxOn(): void
禁用切割盒。
sectionBoxOff(): void
切换切割盒的开/关状态。
toggleSectionBox(): void
设置光照
setLightConfiguration(config: LightConfiguration): void
config: LightConfiguration:
interface LightConfiguration {
enabled?: boolean
castShadow?: boolean
intensity?: number
color?: number
indirectLightIntensity?: number
}
interface SunLightConfiguration extends LightConfiguration {
elevation?: number
azimuth?: number
radius?: number
}
enabled
:启用/禁用太阳直射光castShadow
:启用/禁用太阳光投射阴影intensity
:太阳光的强度color
:太阳光的颜色(以 int 类型表示)indirectLightIntensity
:环境光强度(IBL)的强度elevation
:太阳球面角(以弧度为单位)azimuth
:太阳球面方位角(以弧度为单位)radius
:从场景包围球半径的偏移距离系统默认配置:
export const DefaultLightConfiguration = {
enabled: true, // 太阳阴影是否开启
castShadow: false,
intensity: 3, // 太阳光强度
color: 0xffffff,
elevation: 1.8, // 太阳高度
azimuth: 0.75, // 太阳方位角
radius: 0,
indirectLightIntensity: 2,
shadowcatcher: false,
};
目前版本部署只支持linux,如有windows或其它平台的部署需求请联系我们。
stpViewer在线查看器支持stp、step格式文件的输入,如果有其3d格式的文件的展示、3d转换等需求请联系我们。