From 3ab55cb1b519ffe500c21422f3dbc9ae3f37e216 Mon Sep 17 00:00:00 2001 From: var1ableX Date: Wed, 15 Jan 2025 17:18:38 -0500 Subject: [PATCH] ADD isImageEmpty --- __init__.py | 10 ++- __pycache__/__init__.cpython-311.pyc | Bin 0 -> 691 bytes __pycache__/unmasked.cpython-311.pyc | Bin 0 -> 8899 bytes unmasked.py | 91 +++++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 __pycache__/__init__.cpython-311.pyc create mode 100644 __pycache__/unmasked.cpython-311.pyc diff --git a/__init__.py b/__init__.py index 958e39c..6a6b90f 100644 --- a/__init__.py +++ b/__init__.py @@ -1,17 +1,21 @@ -from .unmasked import GetMaskDimensions, isMaskEmpty, GetRandomDimensions +from .unmasked import GetMaskDimensions, isMaskEmpty, GetRandomDimensions, AnyCast, isImageEmpty # Node class mappings NODE_CLASS_MAPPINGS = { "GetMaskDimensions": GetMaskDimensions, "isMaskEmpty": isMaskEmpty, - "GetRandomDimensions": GetRandomDimensions + "GetRandomDimensions": GetRandomDimensions, + "ACC_AnyCast": AnyCast, + "isImageEmpty": isImageEmpty } # Node display name mappings NODE_DISPLAY_NAME_MAPPINGS = { "GetMaskDimensions": "Get Mask Dimensions", "isMaskEmpty": "Is Mask Empty", - "GetRandomDimensions": "Get Random Dimensions" + "GetRandomDimensions": "Get Random Dimensions", + "ACC_AnyCast": "Any Cast", + "isImageEmpty": "Is Image Empty" } WEB_DIRECTORY = "./web" diff --git a/__pycache__/__init__.cpython-311.pyc b/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cddcdd6f1adfc40c2625387d90fe03e1a860394b GIT binary patch literal 691 zcma)3&x_MQ6rTKQ(#EJI6(x%$h?k;t!J~*6)35}#+0rPoabb*|u>?EGl1Y*FwBGy= zym;~={x>~%2)TOl7TDXKoJqIr;>nre@!t1+^Sv3~55wpHw%$JeGXEt4@S7LA)w)d1 z1D1RR2q0krh!6=xj6@oxt-ZaV4EI0b_XDXigQJlL-9sk~;n{NNz0tOgwU;pEUchJiEot~le3_Y#i$ zspq~rnjQy(PNgkV!k&lGKYz*jG@3u;ZJzP51!vl3jqaG##I8Tqh! z?Yq0=WVWP5MqrvDOm`r3W;0A_mM08@FiDdF!r|%aLVHFsv|Qlld6yaTLDA1F)RG_w zC3v^_zf)_#dQ_VIa&K6gR@t*_y>(Zt0Sg;o);(bDm*#_V?@4LiFMAIe+vjYbu~vN> Ubnl%RWoNQ!&Y8-0ev7^0FZWT$;s5{u literal 0 HcmV?d00001 diff --git a/__pycache__/unmasked.cpython-311.pyc b/__pycache__/unmasked.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..603284a0345031941a918b42f0bb74b385d71e8a GIT binary patch literal 8899 zcmb_hTWnMLnLl?Q+ew_n&cy)-a}A~t$P7>z5Yr^&#(+a10g|Qb8lRKofMbXMIhjdZ zXY01CR`)+p=>^=ZHFe{9E& z1Iw)DZ~OEA{O_0V^83E?uZ@ik2GY6X>Dixp8RkFnp`650X6rAI`Gipzg^e=P);~MV za?A*$aE};;|D0o(Kf=#S(;Tf4phnzL!_yiGYHT}d1UkAnEz%Y;w6O1JA<-HK)Hqe! z=RC{^ztW5{$EdQ>@Hq>m@GF(tl}6Pz!zoRVglPxu?SkITJH~Y?>`f-n@(p$hMoN9@ zUwKDcKY+(i7?qi36=s@K*hkDXuL`*L&!Ogzv@w!tQQ@a0MVPiJ;bv;frC|iup!_2DEyRdA^p^z5Sj8G`i zRkxzvavfg&mJLXXDaZ|JVGFWM&3bXIbiGZGf%UQqr|=r9!Et^e1WlQ!4;M9}DyD!_ z2VfW1`fq+fa7@?|t6Tda$bY7DEO>o#A~Z2|eduPwSHG&NY8l$=dw`^vqQo?I6q?&t z?M0sRHWhiH*->N!yMr`BeLyhzvET%0hx|5yQt=~AG3HEZPSs}T43k|l*=5tFE~$}4 zLp4QhK0K>N%9jtF83BHDr>7x`X@xba*y4UApM(Sc(+*i%;gZ~X^-{}&?BGm=eL!0g zPJ!jrjE@_mDG8kYryUYovo5}-AMWAp`Uy#1k+%1@Ue+t+0qB3NB&~?hr|L}Js*jWu zzV$pd=<{vok(0Khm;k<2qy(&e#h#RtQq{8~X-_&TS8odvJo;e}06DCOjKzhh8W3pN z4gxKBMVtQyZ#*EGq7f&NInx%4#}X=un__HnUX7akycPozUNQyEQ0D_q(gN*G2MSpz zOh|aybVlNFqG++Oq3Tef#X__I^WmjR-iR-RqUwwhS~4A#{Ic0}FK(bNAt)SBSNpt7 zI$$=^2}E}S@oy(flHIea5u$5>t(4SU;%vP{m&C32Vl*BJNA*j+yYxfJ)&B=bih1t! zt%lb+(pUalV)ppgPCRjZIhpMm%ykXsy9U!AJa=_HbNM%1{+#PT-gRI-yy5D}x_X{> z?9U{iN7ueJ@A`$O{aNqXocCX=Qt0b>!mj=3neXI=?_|!`m-qFhgN5A+Vbr#R>(e>U$*22so_Etj1$exl zYdiI{FV}WDJ^b9=xq4*%*pvHN_qlAtIjY5|z6{ui9gczCG&zO2$}N!N_;><{j+(V} z9rP{;YRQE6wP)Xkoh|_ZP0D%g=Zj2*oMZYfv)NOFUtP|f8q1#=%gHCwV*0~OV*NeX zL~~naX7&D)V_DbftbCd-Gx&uQ?Mf^>uZBXVBNUpCD~nOgH-thD7sFAjh9J)Xe@4T) zKCc>cafRS2%!V676O%WBmI0_d1^cfJ-8ALl$>89`*f^M!!TyP%k?|W-bZ7KrtTRFz zLQo-5f*CymBvttoIaX{eG8G~*QcIB&MKBjYUhwev=|4}adoCf3$FIm zXi@NsXNpWcvF67aal%R}tK{zrIyg1`8p!w1{DQGuV@Xg~P}8&x8VF{s!=bhkoA@n; zz|&87s>Z6A`*To383@e1|+f8&-&sb&3FJR+} zDR;INnmic|OnFBGnDQnWOu0>_3jw@f8yFwII@BKoC26}Ck4M#T%;JK*Fi4HHt}OHr z)V#@BukcBJ2EpI!tn(c@K#kSgw#HzyEt^^k0p7+MHvqJQNy&Z~Kfsd%@MrSj*fQzC z0+xz-)ghXVnr^9774JWBtok_X^k_}nF&I!k3?#*Dx;r1AU!7S0;cupL?w-86=b8KX zhWmKV-J5s!W?j8mxz}Q5R3l)ZwiV80C@^iBPPtDENB#(>BoSea$#*J zLHNocJ|~eH|808jv6`ep|5)2tm?}olwL;?!>Wc{Uby4Y7nYKqSX-IlJw4+ z>8nKjCJeDH>WJDqR=ajX?F0=H3@-y8Q+B6PZaTx;&Pm@p%A=h8kV=-;0K!!O?Iu>R-^7)TsZ%aCA}C{b8c|5fuh{ zD`WNRIsinycBrtQqDa31P%KXTTFgHQ$+eE=TSv1EqX1hxzRVd=fs^Zz-`vf)kLBIRp1DtMxKHNXeR+3ZT7KT#nf^&u z?s|hB8iA<^l5t!Js)bbL^X)K(A29|J3uEj>jL|6WDKhoM(nB~aPFP80j^4TqMgQOM z1O_J{MB!BIV3HiB8^Gd?a7>BMza~h5lcH#CdFZ4Hn`Ai+WH*LSjqZ{gQ>yRh%j(}Q1$_NVN)Uiyknl1_VdQcYhO3Ib za8-T_;y!9wCL#z}%SnI?y~jDol+c@$6p0r!u>_iYX8^=T%ekabtJhcL7=#^?!iv0N zOWJ-5fy$)(Tjo=K#jfy4yT*bGFDLCYz!Pg6+^`s|Gb(u2TX<|%d?o>$578D@VQG$s z;1B-*7t0V=H9}OlohGE(6m6R!>|eWN7#Y|F7Q+V#BG1IxVBBx9n2w4YO@zLnMzk4C zRs6siv!Is23@F-%pnO5X{P&jqeP?@tA04;QN?58_vUtd};lCC$AOL1VCImwQ8Q?X{ zP+o+ALVahgAc2*y)yrnvEco`;aG@&i{=MB8unw2*+V_{RPkjgo2)Nh3KJaTFI@#q6 zsP!uwt|M93kg;8?cp*pv63CUR{9`L==d zFoXs69$rsm&ZdXJhPgYlt^@F0g;T-*wD7#cw`yc!g+2cDBTo)xyG|B)wz&^%ASL!b z%bEom$UCqW@-7k#V^U9?oWUG=;N&b4MArmeL2@35=^US&z_4s^{PNJQF82gBr35lM zN^Gj~L37vx%P14e<+h{C4W#07V?jIPIe_M{r(zDlhOts?BDo>*6nQ%B%e zNkS>N)eV_yo2c>%rwTKI!o$k|5rd$hjBWj~WyC0^D^$vbP#P8i!VuM1B(WN$fUY0a zOeI&_@*IaPw&EGyMJE0*R+RwMf)V<7w}rTdjpYE>|4fKa?tQtP~8gH=x{GSFK)#wrg4 z|2sx_$IiTQjTr2&oq?k>96rdfjDh!BO7**&Vq&dJ{1o#M`{s5@v}pFADczj7F%}%5 z_SY1Lua5Umm{M@^+Q85a3zQ(EP7DWZCa)WS(ZM*F;!HFiHVDF7h&)q#qeCZ}As<00 z#4Aw2l4T?@AUfV8Xh+J9rfiVqP$UfF{Q`=AkM;ir1lYW>DK%WMxiaTAY+7=?0d8Jz3cLm(GCCUtpD_8OMB+w$DNNm%RQ$y z?A=*=_olNg6aKVgtvlyDns**8GA_HX;A+nF{nKK4vEcP(q>S|3+l_yljUB7(r|;$( z_vIV+6&Z)!SLAGs`!_w_)%_ojJ|4}m1-B>j@KXvbKil?@T*s#)Swy0 zqJQ17)`3H1q*t$A{k07{-hO;LJzQ|Mq^{}cYyY{iYv3sJ=c6qH7x)M~R}vmOrmX=W z)k+G0_#56U!n;fs-YN?4R#61l4sTHbw%g#UWva*q;m~V5`{6(^XR#ygGK> z=Fm`D8^d#^tKPAlzsVP^cOaL@Dl|c9)IR_U@Qh^( zOhbx(3QSXqeu_dL3vU?e$qOudxm_{CwzCkatS2w9?B#aFscsg+3H9U!mc87r7+@K; zDbBtK#eYssFGY#(a_cQPQ^5Q>VOvy#T%eJl_ agjY>$>rQgc!@>pClNVU_a+eBvbN>r@tg%-B literal 0 HcmV?d00001 diff --git a/unmasked.py b/unmasked.py index 23a9b42..96c5874 100644 --- a/unmasked.py +++ b/unmasked.py @@ -1,4 +1,5 @@ import torch +import numbers class GetMaskDimensions: def __init__(self): @@ -75,6 +76,39 @@ class isMaskEmpty: isEmpty = is_mask_empty(mask) return (isEmpty,) # Return the boolean value as a tuple +class isImageEmpty: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "image": ("IMAGE",), # IMAGE type is specific to ComfyUI inputs + } + } + + RETURN_TYPES = ("BOOLEAN",) # Return type expected by ComfyUI + RETURN_NAMES = ("is_empty",) # Name of the returned value + FUNCTION = "execute" + CATEGORY = "accessories" # Adjusted as per your request + + def execute(self, image): + """ + Check if the image is completely black (all pixel values are zero). + Assumes the image is a torch tensor in CHW format. + """ + import torch # Ensure torch is imported within the function's scope + + if not isinstance(image, torch.Tensor): + raise TypeError("The input 'image' must be a torch.Tensor.") + + # Check if all pixel values in the tensor are zero + is_empty = torch.all(image == 0.0).item() + + return (is_empty,) # Return a tuple as required by ComfyUI + + import random class GetRandomDimensions: @@ -118,3 +152,60 @@ class GetRandomDimensions: #return width, height return {"ui": {"text": text}, "result": (width, height, text)} + +# wildcard trick is taken from pythongossss's +class AnyType(str): + def __ne__(self, __value: object) -> bool: + return False + +ANY_TYPE = AnyType("*") + +def try_cast(x, dst_type: str): + result = x + if dst_type == "STRING": + result = str(x) + elif dst_type == "INT": + result = int(x) + elif dst_type == "FLOAT" or dst_type == "NUMBER": + result = float(x) + elif dst_type == "BOOLEAN": + if isinstance(x, numbers.Number): + if x > 0: + result = True + else: + result = False + elif isinstance(x, str): + try: + x = float(x) + if x > 0: + result = True + else: + result = False + except: + result = bool(x) + else: + result = bool(x) + return result + + +class AnyCast: + def __init__(self): + pass + + @classmethod + def INPUT_TYPES(self): + return { + "required": { + "ANY" : (ANY_TYPE, {}), + "TYPE": (["*", "STRING", "INT", "FLOAT", "BOOLEAN", "IMAGE", "LATENT", "MASK", "NOISE", "SAMPLER", "SIGMAS", "GUIDER", "MODEL", "CLIP", "VAE", "CONDITIONING"], {}), + }, + } + + TITLE = "Any Cast" + RETURN_TYPES = (ANY_TYPE, ) + FUNCTION = "run" + CATEGORY = "Accessories" + + def run(self, ANY, TYPE): + result = try_cast(ANY, TYPE) + return (result, ) \ No newline at end of file