华农3D项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

694 lines
22 KiB

  1. // 从这里开始
  2. var h1 = null
  3. var h2 = null
  4. var h3 = null
  5. var oldtransformNodex = null
  6. // var oldtransformNodeOther = null
  7. // var oldMesh = null
  8. var oldMeshOther = null
  9. var drag = null
  10. // var notmoveGroup = null
  11. // var movedGroup = null
  12. // var movesingle = false
  13. // var dynamicTexture = null
  14. // var dynamicTexture2 = null
  15. // var show = 50
  16. // var showdd = 50
  17. var isRotating = true
  18. var camera
  19. BABYLON.DefaultLoadingScreen.prototype.displayLoadingUI = function() {
  20. if (document.getElementById('customLoadingScreenDiv')) {
  21. document.getElementById('customLoadingScreenDiv').style.display = 'initial'
  22. return
  23. }
  24. this._loadingDiv = document.createElement('div')
  25. // this._loadingDiv.style.height = '1750px';
  26. this._loadingDiv.id = 'customLoadingScreenDiv'
  27. thecss = 'lohingifpc'
  28. thecss2 = 'zcpc'
  29. this._loadingDiv.innerHTML = "<div class='oka'><div class='" + thecss + "'><image src='./logok.gif' class='jiazaiimg'/></div></div>"
  30. this._resizeLoadingUI()
  31. window.addEventListener('resize', this._resizeLoadingUI)
  32. document.body.appendChild(this._loadingDiv)
  33. }
  34. // var movebyName = function(nodeName) {
  35. // var x = scene.getTransformNodeByName(nodeName)
  36. // moveTrans(x)
  37. // }
  38. BABYLON.DefaultLoadingScreen.prototype.hideLoadingUI = function() {
  39. show = 50
  40. document.getElementById('customLoadingScreenDiv').style.display = 'none'
  41. document.getElementById('customLoadingScreenDiv_first').style.display = 'none'
  42. document.title = '整体'
  43. // var prepareGroupButton = function(transformNodex, color, qu) {
  44. // var mesheses = null
  45. // if (transformNodex.getClassName() === 'TransformNode') {
  46. // mesheses = transformNodex.getChildMeshes(false)
  47. // } else {
  48. // mesheses = []
  49. // mesheses.push(transformNodex)
  50. // }
  51. // for (var i = 0; i < mesheses.length; i++) {
  52. // mesheses[i].actionManager = new BABYLON.ActionManager(scene)
  53. // // var theScaling = mesheses[i].scaling
  54. // /* if (true) {
  55. // try {
  56. // mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOutTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x, theScaling.y, theScaling.z), 100));
  57. // mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOverTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x * 1.01, theScaling.y * 1.01, theScaling.z * 1.01), 100));
  58. // } catch (error) {
  59. // //alert(error)
  60. // }
  61. // }*/
  62. // var clickbegin = false
  63. // mesheses[i].actionManager.registerAction(
  64. // new BABYLON.ExecuteCodeAction({
  65. // trigger: BABYLON.ActionManager.OnPointerOverTrigger,
  66. // parameter: ''
  67. // },
  68. // function() {
  69. // clickbegin = true
  70. // if (true) {
  71. // if (oldtransformNodeOther != null) {
  72. // oldtransformNodeOther.removeBehavior(drag)
  73. // var mesheses2 = null
  74. // if (oldtransformNodeOther.getClassName() == 'TransformNode') {
  75. // mesheses2 = oldtransformNodeOther.getChildMeshes(false)
  76. // } else {
  77. // mesheses2 = []
  78. // mesheses2.push(oldtransformNodeOther)
  79. // }
  80. // for (var i = 0; i < mesheses2.length; i++) {
  81. // try {
  82. // h2.removeMesh(mesheses2[i])
  83. // } catch (error) {
  84. // // alert(error)
  85. // }
  86. // }
  87. // }
  88. // oldtransformNodeOther = transformNodex
  89. // // transformNodex.addBehavior(drag);
  90. // var mesheses3 = null
  91. // if (transformNodex.getClassName() === 'TransformNode') {
  92. // mesheses3 = transformNodex.getChildMeshes(false)
  93. // } else {
  94. // mesheses3 = []
  95. // mesheses3.push(transformNodex)
  96. // }
  97. // for (var i = 0; i < mesheses3.length; i++) {
  98. // try {
  99. // h2.addMesh(mesheses3[i], color)
  100. // } catch (error) {
  101. // // alert(error)
  102. // }
  103. // }
  104. // clickbegin = false
  105. // }
  106. // }
  107. // )
  108. // )
  109. // mesheses[i].actionManager.registerAction(
  110. // new BABYLON.ExecuteCodeAction({
  111. // trigger: BABYLON.ActionManager.OnPickTrigger,
  112. // parameter: ''
  113. // },
  114. // function() {
  115. // clickbegin = true
  116. // if (true) {
  117. // try {
  118. // quClick(qu)
  119. // } catch (error) {
  120. // // alert(error)
  121. // }
  122. // clickbegin = false
  123. // }
  124. // }
  125. // )
  126. // )
  127. // }
  128. // }
  129. // var prepareGroupButton2 = function(transformNodex, color, qu) {
  130. // var mesheses = null
  131. // if (transformNodex.getClassName() === 'TransformNode') {
  132. // mesheses = transformNodex.getChildMeshes(false)
  133. // } else {
  134. // mesheses = []
  135. // mesheses.push(transformNodex)
  136. // }
  137. // for (var i = 0; i < mesheses.length; i++) {
  138. // mesheses[i].actionManager = new BABYLON.ActionManager(scene)
  139. // // var theScaling = mesheses[i].scaling
  140. // /* if (true) {
  141. // try {
  142. // mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOutTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x, theScaling.y, theScaling.z), 100));
  143. // mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOverTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x * 1.01, theScaling.y * 1.01, theScaling.z * 1.01), 100));
  144. // } catch (error) {
  145. // //alert(error)
  146. // }
  147. // }*/
  148. // var clickbegin = false
  149. // mesheses[i].actionManager.registerAction(
  150. // new BABYLON.ExecuteCodeAction({
  151. // trigger: BABYLON.ActionManager.OnPointerOverTrigger,
  152. // parameter: ''
  153. // },
  154. // function() {
  155. // clickbegin = true
  156. // if (true) {
  157. // if (oldtransformNodeOther != null) {
  158. // oldtransformNodeOther.removeBehavior(drag)
  159. // var mesheses2 = null
  160. // if (oldtransformNodeOther.getClassName() === 'TransformNode') {
  161. // mesheses2 = oldtransformNodeOther.getChildMeshes(false)
  162. // } else {
  163. // mesheses2 = []
  164. // mesheses2.push(oldtransformNodeOther)
  165. // }
  166. // for (var i = 0; i < mesheses2.length; i++) {
  167. // try {
  168. // h2.removeMesh(mesheses2[i])
  169. // } catch (error) {
  170. // // alert(error)
  171. // }
  172. // }
  173. // }
  174. // oldtransformNodeOther = transformNodex
  175. // // transformNodex.addBehavior(drag);
  176. // var mesheses3 = null
  177. // if (transformNodex.getClassName() === 'TransformNode') {
  178. // mesheses3 = transformNodex.getChildMeshes(false)
  179. // } else {
  180. // mesheses3 = []
  181. // mesheses3.push(transformNodex)
  182. // }
  183. // for (var i = 0; i < mesheses3.length; i++) {
  184. // try {
  185. // h2.addMesh(mesheses3[i], color)
  186. // } catch (error) {
  187. // // alert(error)
  188. // }
  189. // }
  190. // clickbegin = false
  191. // }
  192. // }
  193. // )
  194. // )
  195. // mesheses[i].actionManager.registerAction(
  196. // new BABYLON.ExecuteCodeAction({
  197. // trigger: BABYLON.ActionManager.OnPickTrigger,
  198. // parameter: ''
  199. // },
  200. // function() {
  201. // clickbegin = true
  202. // if (true) {
  203. // try {
  204. // // quClick(transformNodex.name)
  205. // cameraClick(transformNodex)
  206. // } catch (error) {
  207. // // alert(error)
  208. // }
  209. // clickbegin = false
  210. // }
  211. // }
  212. // )
  213. // )
  214. // }
  215. // }
  216. var prepareGroupButton2ByMesh = function(transformNodex, color, qu) {
  217. var mesheses = null
  218. if (transformNodex.getClassName() === 'Mesh') {
  219. mesheses = []
  220. mesheses.push(transformNodex)
  221. }
  222. for (var i = 0; i < mesheses.length; i++) {
  223. mesheses[i].actionManager = new BABYLON.ActionManager(scene)
  224. // var theScaling = mesheses[i].scaling
  225. /* if (true) {
  226. try {
  227. mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOutTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x, theScaling.y, theScaling.z), 100));
  228. mesheses[i].actionManager.registerAction(new BABYLON.InterpolateValueAction(BABYLON.ActionManager.OnPointerOverTrigger, mesheses[i], "scaling", new BABYLON.Vector3(theScaling.x * 1.01, theScaling.y * 1.01, theScaling.z * 1.01), 100));
  229. } catch (error) {
  230. //alert(error)
  231. }
  232. }*/
  233. // let clickbegin = false
  234. mesheses[i].actionManager.registerAction(
  235. new BABYLON.ExecuteCodeAction({
  236. trigger: BABYLON.ActionManager.OnPointerOverTrigger,
  237. parameter: ''
  238. },
  239. function() {
  240. // clickbegin = true
  241. // if (true) {
  242. if (oldMeshOther != null) {
  243. oldMeshOther.removeBehavior(drag)
  244. var mesheses2 = null
  245. if (oldMeshOther.getClassName() === 'Mesh') {
  246. mesheses2 = []
  247. mesheses2.push(oldMeshOther)
  248. }
  249. for (var i = 0; i < mesheses2.length; i++) {
  250. try {
  251. h2.removeMesh(mesheses2[i])
  252. } catch (error) {
  253. // alert(error)
  254. }
  255. }
  256. }
  257. oldMeshOther = transformNodex
  258. // transformNodex.addBehavior(drag);
  259. var mesheses3 = null
  260. if (transformNodex.getClassName() === 'Mesh') {
  261. mesheses3 = []
  262. mesheses3.push(transformNodex)
  263. }
  264. for (let i = 0; i < mesheses3.length; i++) {
  265. try {
  266. h2.addMesh(mesheses3[i], color)
  267. } catch (error) {
  268. // alert(error)
  269. }
  270. }
  271. // clickbegin = false
  272. isRotating = false
  273. camera.useAutoRotationBehavior = isRotating
  274. // }
  275. }
  276. )
  277. )
  278. // 移出事件
  279. mesheses[i].actionManager.registerAction(
  280. new BABYLON.ExecuteCodeAction({
  281. trigger: BABYLON.ActionManager.OnPointerOutTrigger,
  282. parameter: ''
  283. },
  284. function() {
  285. // clickbegin = true
  286. // if (true) {
  287. var mesheses4 = null
  288. if (transformNodex.getClassName() === 'Mesh') {
  289. mesheses4 = []
  290. mesheses4.push(transformNodex)
  291. }
  292. for (var i = 0; i < mesheses4.length; i++) {
  293. try {
  294. h2.removeMesh(mesheses4[i])
  295. } catch (error) {
  296. // alert(error)
  297. }
  298. }
  299. // clickbegin = false
  300. isRotating = true
  301. camera.useAutoRotationBehavior = isRotating
  302. // }
  303. }
  304. )
  305. )
  306. mesheses[i].actionManager.registerAction(
  307. new BABYLON.ExecuteCodeAction({
  308. trigger: BABYLON.ActionManager.OnPickTrigger,
  309. parameter: ''
  310. },
  311. function() {
  312. // clickbegin = true
  313. // if (true) {
  314. try {
  315. // quClick(transformNodex.name)
  316. cameraClick(transformNodex)
  317. } catch (error) {
  318. // alert(error)
  319. }
  320. // clickbegin = false
  321. // }
  322. }
  323. )
  324. )
  325. }
  326. }
  327. // 绑功能点
  328. // var cl = new BABYLON.Color3(0, 0, 1)
  329. // var smokeAlarms = []
  330. // scene.transformNodes.forEach(function(node) {
  331. // if (node.name.startsWith('smokealarm')) {
  332. // smokeAlarms.push(node)
  333. // }
  334. // })
  335. // var length = smokeAlarms.length
  336. // console.log('以 smokealarm 开头的对象数量:', length)
  337. // smokeAlarms.forEach(function(jk01) {
  338. // var parts = jk01.name.split('.')
  339. // if (parts.length > 1) {
  340. // jk01.nameID = 'S' + parts[1]
  341. // } else {
  342. // jk01.nameID = 'S000'
  343. // }
  344. // jk01.baojing = false
  345. // prepareGroupButton2(jk01, cl)
  346. // })
  347. // 存储所有 camera 相关的 Mesh
  348. const cameraMeshes = []
  349. scene.meshes.forEach(mesh => {
  350. if (mesh.name.startsWith('camera')) {
  351. cameraMeshes.push(mesh)
  352. }
  353. })
  354. const cameraCount = cameraMeshes.length
  355. console.log('以 camera 开头的 Mesh 数量:', cameraCount)
  356. // 定义颜色
  357. // const colorRed = new BABYLON.Color3(1, 0, 0) // 红
  358. const colorBlue = new BABYLON.Color3(0, 0, 1)
  359. cameraMeshes.forEach((cam, index) => {
  360. const paddedIndex = String(index + 1).padStart(3, '0')
  361. cam.nameID = `C${paddedIndex}`
  362. prepareGroupButton2ByMesh(cam, colorBlue, '摄像头1')
  363. })
  364. var light = new BABYLON.HemisphericLight('HemiLight', new BABYLON.Vector3(0, 1, 0), scene)
  365. light.intensity = 2
  366. light.diffuse = new BABYLON.Color3(0.92, 0.92, 0.92)
  367. }
  368. BABYLON.DracoCompression.Configuration.decoder.wasmUrl = './js/draco_wasm_wrapper_gltf.js'
  369. BABYLON.DracoCompression.Configuration.decoder.wasmBinaryUrl = './js/draco_decoder_gltf.wasm'
  370. BABYLON.DracoCompression.Configuration.decoder.fallbackUrl = './js/draco_decoder_gltf.js'
  371. // createScene function that creates and return the scene
  372. var createScene = function() {
  373. engine.displayLoadingUI()
  374. var scene = new BABYLON.Scene(engine)
  375. camera = new BABYLON.ArcRotateCamera('Camera', 0, 0, 5, new BABYLON.Vector3(0, -1, 0), scene)
  376. camera.setTarget(new BABYLON.Vector3(0, -9, 0))
  377. camera.attachControl(canvas, true)
  378. camera.lowerRadiusLimit = 60.0 // 这里是最大的位置,值越大,物体越小
  379. camera.upperRadiusLimit = 100
  380. camera.radius = 20.328
  381. camera.alpha = Math.PI * -218.4 / 180
  382. camera.beta = Math.PI * 66 / 180
  383. camera.inertia = 0.1 // 缩放的快慢
  384. camera.useAutoRotationBehavior = isRotating // 自动旋转
  385. camera.panningDistanceLimit = 2 // 平移半径
  386. camera.panningInertia = 0
  387. camera.autoTransitionRange = 1
  388. camera.pinchToPanMaxDistance = 0.1
  389. camera.pinchDeltaPercentage = 0.001
  390. camera.useAutoRotationBehavior = true
  391. // 改变场景背景颜色 - 背景颜色opacity值设为0,达到透明背景的效果
  392. scene.clearColor = new BABYLON.Color4(0, 0, 0, 0)
  393. scene.activeCamera = camera
  394. scene.activeCamera.useInputToRestoreState = true
  395. // var camera1_status = scene.activeCamera.storeState()
  396. var assetsManager = new BABYLON.AssetsManager(scene)
  397. var meshTask = assetsManager.addMeshTask('skull task', '', 'asset/', 'F5.glb')
  398. meshTask.onSuccess = function(task) {
  399. task.loadedMeshes[0].scaling = new BABYLON.Vector3(0.4, 0.4, 0.4)
  400. task.loadedMeshes[0].position = new BABYLON.Vector3(0, 0.35, 0)
  401. }
  402. meshTask.onError = function(task, message, exception) {
  403. console.log(message, exception)
  404. }
  405. var hdrTexture = new BABYLON.CubeTexture.CreateFromPrefilteredData('textures/environmentSpecular.env', scene)
  406. scene.environmentTexture = hdrTexture
  407. var spriteManagerPlayer = new BABYLON.SpriteManager('playerManager', './img/bl9.png', 10, {
  408. width: 100,
  409. height: 100
  410. }, scene)
  411. // spriteManagerPlayer.renderingGroupId = 2;
  412. spriteManagerPlayer.isPickable = true
  413. scene.onPointerDown = function(evt) {
  414. var pickResult = scene.pickSprite(this.pointerX, this.pointerY)
  415. var pick = scene.pick(scene.pointerX, scene.pointerY)
  416. console.log('pick', pick.pickedPoint)
  417. if (pickResult.pickedSprite != null) {
  418. if (pickResult.hit) {
  419. alert(pickResult.pickedSprite.name)
  420. }
  421. }
  422. }
  423. // renderCanvas.style.backgroundImage = 'url("./textures/' + '4' + '.jpg")'
  424. // console.log("x2");
  425. assetsManager.load()
  426. drag = new BABYLON.PointerDragBehavior({
  427. dragPlaneNormal: new BABYLON.Vector3(0, 0, 1)
  428. })
  429. // drag.useObjectOrienationForDragging = false;
  430. drag.validateDrag = (targetPosition) => {
  431. // console.log(targetPosition)
  432. if (targetPosition.x > 10.5 || targetPosition.x < -10.5) {
  433. return false
  434. }
  435. if (targetPosition.z > 10.5 || targetPosition.z < -10.5) {
  436. return false
  437. }
  438. if (oldtransformNodex != null) {
  439. return true
  440. }
  441. }
  442. drag.onDragEndObservable.add((event) => {
  443. // console.log("dragEnd");
  444. // console.log(event);
  445. // console.log(line03_position)
  446. })
  447. // console.log("x3");
  448. // GUI
  449. h1 = new BABYLON.HighlightLayer('hl1', scene)
  450. h2 = new BABYLON.HighlightLayer('hl2', scene)
  451. h3 = new BABYLON.HighlightLayer('hl2', scene)
  452. var step = 0.1
  453. var currentx = 1
  454. // var step2 = 0.1
  455. // var currentx2 = 0.1
  456. h1.blurHorizontalSize = 0.1
  457. // var showx = 0
  458. // var showx2 = 2
  459. // console.log("x4");
  460. scene.registerAfterRender(() => {
  461. h1.blurHorizontalSize = h1.blurVerticalSize + currentx
  462. var nodealert = scene.getTransformNodeByName('yan')
  463. if (nodealert != null) {
  464. var mesheses3 = null
  465. if (nodealert.getClassName() === 'TransformNode') {
  466. mesheses3 = nodealert.getChildMeshes(false)
  467. } else {
  468. mesheses3 = []
  469. mesheses3.push(nodealert)
  470. }
  471. for (var i = 0; i < mesheses3.length; i++) {
  472. try {
  473. if (nodealert.baojing === true) {
  474. h3.addMesh(mesheses3[i], new BABYLON.Color3(1, 0, 0))
  475. } else {
  476. h3.removeMesh(mesheses3[i])
  477. }
  478. } catch (error) {
  479. // alert(error)
  480. }
  481. }
  482. }
  483. })
  484. if (currentx > 0.5) {
  485. step *= -1
  486. }
  487. if (currentx < 0) {
  488. step *= -1
  489. }
  490. currentx += step
  491. // console.log("here");
  492. return scene
  493. }
  494. var canvas = document.getElementById('renderCanvas')
  495. // load the 3D engine
  496. var engine = new BABYLON.Engine(canvas, true, {
  497. stencil: true
  498. })
  499. // call the createScene function
  500. var scene = createScene()
  501. scene.autoClear = true
  502. scene.imageProcessingConfiguration.exposure = 1
  503. scene.imageProcessingConfiguration.contrast = 1
  504. scene.environmentIntensity = 0.4
  505. engine.runRenderLoop(function() {
  506. scene.render()
  507. })
  508. window.addEventListener('resize', function() {
  509. engine.resize()
  510. })
  511. // 功能:点区以后跳转到新页
  512. // quName :转过来的区号
  513. // function quClick(quName) {
  514. // if (quName === '现行w文件室内') {
  515. // window.location.href = 'http://ikki2000.gitee.io/101/webA/index.html'
  516. // }
  517. // if (quName === '待销文件室') {
  518. // window.location.href = 'http://ikki2000.gitee.io/101/webB/index.html'
  519. // }
  520. // }
  521. // 功能:点camera后事件
  522. // function cameraClick(camera) {
  523. // alert(camera.nameID)
  524. // }
  525. function cameraClick(TheCamera) {
  526. window.parent.postMessage(
  527. {
  528. data: TheCamera.nameID
  529. },
  530. '*'
  531. )
  532. }
  533. function HashMap() {
  534. // 定义长度
  535. var length = 0
  536. // 创建一个对象
  537. var obj = {}
  538. // 判断Map是否为空
  539. this.isEmpty = function() {
  540. return length === 0
  541. }
  542. // 判断对象中是否包含给定Key
  543. this.containsKey = function(key) {
  544. return (key in obj)
  545. }
  546. // 判断对象中是否包含给定的Value
  547. this.containsValue = function(value) {
  548. for (var key in obj) {
  549. if (obj[key] === value) {
  550. return true
  551. }
  552. }
  553. return false
  554. }
  555. // 向map中添加数据
  556. this.put = function(key, value) {
  557. if (!this.containsKey(key)) {
  558. length++
  559. }
  560. obj[key] = value
  561. }
  562. // 根据给定的key获取Value
  563. this.get = function(key) {
  564. return this.containsKey(key) ? obj[key] : null
  565. }
  566. // 根据给定的Key删除一个值
  567. this.remove = function(key) {
  568. if (this.containsKey(key) && (delete obj[key])) {
  569. length--
  570. }
  571. }
  572. // 获得Map中所有的value
  573. this.values = function() {
  574. var _values = []
  575. for (var key in obj) {
  576. _values.push(obj[key])
  577. }
  578. return _values
  579. }
  580. // 获得Map中的所有key
  581. this.keySet = function() {
  582. var _keys = []
  583. for (var key in obj) {
  584. _keys.push(key)
  585. }
  586. return _keys
  587. }
  588. // 获得Map的长度
  589. this.size = function() {
  590. return length
  591. }
  592. // 清空Map
  593. this.clear = function() {
  594. length = 0
  595. obj = {}
  596. }
  597. }
  598. var yangans = new HashMap()
  599. yangans.put('CAM_000', 'yan')
  600. // console.log("here2");
  601. // yangans.put('DAK_MO_CAM_002', 'camera02');
  602. // yangans.put('DAK_MO_CAM_003', 'camera03');
  603. // yangans.put('DAK_MO_CAM_004', 'camera04');
  604. // yangans.put('ZLS_MO_CAM_001', 'camera05');
  605. // yangans.put('ZLS_MO_CAM_002', 'camera06');
  606. // yangans.put('YLS_MO_CAM_001', 'camera07');
  607. // yangans.put('YLS_MO_CAM_002', 'camera08');
  608. // yangans.put('ZL_MO_CAM_001', 'camera09');
  609. // 功能转入报警
  610. // function Myalert(MathineID, baojingx) {
  611. // var theName = yangans.get(MathineID)
  612. // if (theName === 'yan') {
  613. // // console.log(scene);
  614. // xx = scene.getTransformNodeByName('yan').baojing = baojingx
  615. // }
  616. // }
  617. // scene.debugLayer.show();
  618. // 报警 true:表示报警, false :表示不报警
  619. // Myalert("CAM_000",true)